天天看點

easyui修改源碼實作combobox的真正模糊查詢

combobox的模糊查詢是從頭部比對的,基本上不符合大部分人要求,是以需要改造一下,查詢的方法如下:

/**
 
     * 資料過濾(本地)或者請求(遠端)
 
     * parmas[target] 承載combobox的DOM
 
     * parmas[q] 使用者輸入的文本
 
     */
 
    function doQuery(target, q) {
 
        var opts = $.data(target, "combobox").options;
 
        //設定values?誰會輸入valueField呢?q為text,把text作為value帶進去是什麼意思呢?
 
        //個人覺得這個地方不合理
 
        if (opts.multiple && !q) {
 
            setValues(target, [], true);
 
        } else {
 
            setValues(target, [q], true);
 
        }
 
        if (opts.mode == "remote") {//如果為remote模式,則請求遠端資料
 
            request(target, null, {
 
                        q : q
 
                    }, true);
 
        } else {//本地模式
 
            var panel = $(target).combo("panel");
 
            //隐藏所有下拉選項
 
            panel.find("div.combobox-item").hide();
 
            var data = $.data(target, "combobox").data;
 
            for (var i = 0; i < data.length; i++) {
 
                //如果根據text過濾到(過濾規則為:包含使用者輸入值即比對)比對選項,則顯示、設定選項。
 
                if (opts.filter.call(target, q, data[i])) {
 
                    var v = data[i][opts.valueField];
 
                    var s = data[i][opts.textField];
 
                    var item = panel.find("div.combobox-item[value=\"" + v + "\"]");
 
                    //顯示item
 
                    item.show();
 
                    if (s == q) {//完全比對(即完全等于)
 
                        //設定values
 
                        setValues(target, [v], true);
 
                        //添加選中樣式
 
                        item.addClass("combobox-item-selected");
 
                    }
 
                }
 
            }
 
        }
 
    };      

将jquery.easyui.min.js的源碼手動修改一下

return row[opts.textField].indexOf(q)>-1;//将從頭位置比對改為任意比對
},formatter:function(row){
var opts=$(this).combobox("options");
return row[opts.textField];
},loader:function(_7c9,_7ca,_7cb){
var opts=$(this).combobox("options");
if(!opts.url){
return false;
}