[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]