天天看点

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;
}