chemzqm 发表于 2013-1-15 02:36:24

[Ext插件]PinyinFilter:使用拼音首字母对数据进行过滤

这个插件的目的在于提高用户对于数据的选择效率。经常录入数据的人肯定能明白,在一长串列表中选择你想要记录是一件很费眼神的事;记得当初玩开心网可以按拼音首字母找到自己的好友,当时就觉得很是方便。如果您想提高用户对您软件的评价,请您考虑这个插件。

http://dl.iteye.com/upload/attachment/236916/e3ea789a-1c1d-306d-9b8b-390db4bc3086.png
实现原理:重写了Store中返回过滤函数的方法,使其中需要过滤的汉字转换为其拼音首字母数组(因为有多音字,数组内每一项对应一种拼音的可能性),遍历数组每一项与当前输入项生成的前端匹配正则表达式进行比对,有一个满足就返回true,都不满足返回false

附件有示例
/** * 修改组件内部Store的createFilterFn方法,使其按照拼音首字母进行过滤 * * 1.0.1修改: * 修复了多音字筛选不到的bug * * 1.0.2修改: * 为store添加了一个拼音的缓存 ** @author chemzqm@gmail.com * @version 1.0.2 * @createTime 2010-04-18 23:12:31 */Ext.ns("Ext.ux");Ext.ux.PinyinFilter=function(){    //主要方法,由字符串生成拼音首字母    function makePy(str){if(typeof(str) != "string"){return str;}var arrResult = new Array();for(var i=0,len=str.length;i<len;i++){var ch = str.charAt(i);arrResult.push(checkCh(ch));}var resarr = mkRslt(arrResult);return resarr;    }      function checkCh(ch){      var uni = ch.charCodeAt(0);      if(uni > 40869 || uni < 19968)            return ch; //dealWithOthers(ch);      return (oMultiDiff?oMultiDiff:(strChineseFirstPY.charAt(uni-19968)));    }      function mkRslt(arr){      var arrRslt = [""];      for(var i=0,len=arr.length;i<len;i++){            var str = arr;            var strlen = str.length;            if(strlen == 1){                for(var k=0;k<arrRslt.length;k++){                  arrRslt += str;                }            }else{                var tmpArr = arrRslt.slice(0);                arrRslt = [];                for(k=0;k<strlen;k++){                  var tmp = tmpArr.slice(0);                  for(var j=0;j<tmp.length;j++){                        tmp += str.charAt(k);                  }                  arrRslt = arrRslt.concat(tmp);                }            }      }      return arrRslt;    }      var strChineseFirstPY =【太长,此处省略】    var oMultiDiff=【太长,此处省略】    //重写生成过滤方法的方法    function createFilterFn(property, value, anyMatch, caseSensitive){      if(Ext.isEmpty(value, false)){            return false;      }      value = this.data.createValueMatcher(value, anyMatch, false);      return function(r){    var os = r.data,arr;    if(this.pyCache){arr = this.pyCache;    }    else{arr = makePy(os);this.pyCache = arr;    }      for(var i=0;i<arr.length;i++){if(value.test(arr)){    return true;}    }            return false;      };    }    return{      init:function(c){    var s=c.store;            s.createFilterFn = createFilterFn;//覆盖原方法    s.pyCache = {};//拼音缓存,汉字字符串与其拼音数组的映射      }    }}()
页: [1]
查看完整版本: [Ext插件]PinyinFilter:使用拼音首字母对数据进行过滤