• Ext学习之——实现Combo的本地模糊搜索(支持拼音)


      今天要实现一个Combo本地数据的模糊搜索功能,还要支持拼音首字母模糊查询。效果如下图

    1.汉字模糊搜索

    2.拼音首字母

    说干就干,但是搞了好久都没实现,上网借用了网上很相似的一个例子(版本较多,很抱歉不知是哪位的杰作,没法引用源码出处,深表歉意)

    改装成了自己使用的代码。

    二、基本代码

    1.JSON串(部分节选)

        var allWindsJson = [{"id":2,"fengchang":[{"id":94,"fengji":[],"name":"大唐定边张家山二期项目(33)","bianMa":"DTZJS2","uId":94,"shortName":"张家山二期","orderId":1},{"id":95,"fengji":[],"name":"大唐定边张家山一期项目(33)","bianMa":"DTZJS1","uId":95,"shortName":"张家山一期",
    View Code

    2.store

    var comboStore2 = new Ext.data.JsonStore({
                autoDestroy: true,
                autoLoad : true,  
                storeId: 'comboStore2',
                data:allFengChangJson,
                fields: ['name', 'bianMa']
    });

    3.combo

    var searchCombo2 = new Ext.form.ComboBox({
                //forceSelection: true,
                store: comboStore2,
                valueField:'bianMa',
                displayField:'name',
                200,
                mode: 'local',
                minChars:1,
                triggerAction: 'all'
    });

    4.listeners

    listeners:{//检索监听
                    'beforequery':function(obj){
                    var combo = obj.combo;  
                        var qStr = obj.query;  
                    forceAll = obj.forceAll;  
    
                    if(forceAll === true || (qStr.length >= combo.minChars)){  
                        if(combo.lastQuery !== qStr){  
                            combo.lastQuery = qStr;  
                            if(combo.mode == 'local'){  
                                combo.selectedIndex = -1;  
                                if(forceAll){  
                                    combo.store.clearFilter();  
                                }else{  
                                    combo.store.filterBy(function(record,id){  
                                        var text = record.get(combo.displayField);  
                                        if (checkValueTpye(qStr)==1) {
                                            return (text.indexOf(qStr)!=-1);  
                                        } else{
                                            return (makePy(record.get('name')).toString().toUpperCase().indexOf(qStr.toUpperCase())>-1);
                                        };
                                    });  
                                }  
                                combo.onLoad();  
                            }else{  
                                combo.store.baseParams[combo.queryParam] = qStr;  
                                combo.store.load({  
                                    params: combo.getParams(qStr)  
                                });  
                                combo.expand();  
                            }  
                        }else{  
                            combo.selectedIndex = -1;  
                            combo.onLoad();  
                    }  
                }  
                return false;  
                },//选值监听,失去焦点看值合法不
                'blur':function(obj){
                    console.log(obj);
                    if (!checkValueIsExist(obj.value)) {
                        obj.value='';
                        obj.clearValue();
                        console.log(obj.value);
                    } else{
                        console.log(obj.value);
                    };
                }
    }

    5.function

    //输入字符中英文判断
    function checkValueTpye(valueStr){ 
                var reg=/[u4E00-u9FA5]/g ;
                if(reg.test(valueStr)){
                    return 1;
                }else{
                    return 0;
                } 
            }; 
    //检测选值是否合法
    function checkValueIsExist(str){
                for(var i = 0; i < allWindsJson.length; i++){
                    for(var j = 0; j < allWindsJson[i].fengchang.length; j++){
                        if(allWindsJson[i].fengchang[j].bianMa==str){
                            return true;
                        }
                    }
                }
                return false;
            }

    6.引入汉语转拼音首字母js(基本示例代码,未知的引用出处,请见谅。)

    function makePy(str){
        if(typeof(str) != "string")
        throw new Error(-1,"函数makePy需要字符串类型参数!");
        var arrResult = new Array();//中间结果数组
        for(var i=0,len=str.length;i<len;i++){//获得unicode码
            var ch = str.charAt(i);
            arrResult.push(checkCh(ch));//该unicode码在处理范围之内返回该码对映汉字的拼音首字母
        }
        return mkRslt(arrResult);//处理arrResult,返回所有情况数组
    }
    function checkCh(ch){
        var uni = ch.charCodeAt(0);
        if(uni > 40869 || uni < 19968){
            return ch;//若不在汉字处理范围内,返回原字符
        }
        return (oMultiDiff[uni]?oMultiDiff[uni]:(strChineseFirstPY.charAt(uni-19968)));//多音字判断,是按多音字处理,不是直接在strChineseFirstPY字符串中找对应的首字母
    }
    function mkRslt(arr){
        var arrRslt = [""];
        for(var i=0,len=arr.length;i<len;i++){
            var str = arr[i];
            var strlen = str.length;
            if(strlen == 1){
                for(var k=0;k<arrRslt.length;k++){
                    arrRslt[k] += str;
                }
            }else{
                var tmpArr = arrRslt.slice(0);//提取字符串
                arrRslt = [];
                for(var k=0;k<strlen;k++){//复制一个相同的arrRslt
                    var tmp = tmpArr.slice(0);
                    for(var j=0;j<tmp.length;j++){//把当前字符str[k]添加到每个元素末尾
                        tmp[j] += str.charAt(k);
                    }//把复制并修改后的数组连接到arrRslt上
                    arrRslt = arrRslt.concat(tmp);
                }
            }
        }
        return arrRslt;
    }
    View Code

    7.strChineseFirstPY,oMultiDiff是两个字符串,是汉字的码值和多音字,暂略。

    这样一个功能就实现了。

    注:由于久远,引用的一部分代码忘记来源,没能注明出处,往原作者见谅,继承着着开源分享的理念,算是给原作者的一点慰藉。

     

  • 相关阅读:
    《把时间当作朋友》后记
    《把时间当作朋友》 李笑来
    chrome 和 IE 下 new Date()的不同 导致ajax出错
    ruby vim环境设置
    ASP.NET UserControl传递参数
    win2008 IIS7 ASP 的 405 错误
    天使的微笑——《天使爱美丽》
    随机点击表中某一行
    页面刷新方法
    随机选择下拉列表中的值
  • 原文地址:https://www.cnblogs.com/tzhz/p/3484315.html
Copyright © 2020-2023  润新知