修改easyui combobox源码,实现模糊搜索

easyui 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");
 
                    }
 
                }
 
            }
 
        }
 
    };

原来的匹配方式:

这样必须要开头完全匹配,实在不好用。

//return row[opts.textField].indexOf(q)==0;//
改进升级版:

filter:function(q,row){
	
var opts=$(this).combobox("options");
//return row[opts.textField].indexOf(q)>-1;
return row[opts.textField].toLowerCase().indexOf(q.toLowerCase())>-1;
}
模糊搜索,不区分大小写。

这样就改好了~试试看效果吧~


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
easyui combobox下拉框默认是单选的,如果要实现多选,需要做以下修改: 1. 在combobox的options中添加multiple:true,表示启用多选模式。 2. 在combobox的options中添加onSelect和onUnselect两个事件,用于在选择和取消选择时更新选中的值。 3. 在combobox的panel中添加checkbox或者复选框,用于选择多个选项。 以下是实现多选的示例代码: HTML代码: ``` <input id="cc" class="easyui-combobox" style="width:200px;"> ``` JavaScript代码: ``` $('#cc').combobox({ url: 'get_data.php', valueField: 'id', textField: 'text', multiple: true, panelHeight: 'auto', onSelect: function(record){ var value = $(this).combobox('getValues'); value.push(record.id); $(this).combobox('setValues', value); }, onUnselect: function(record){ var value = $(this).combobox('getValues'); var index = value.indexOf(record.id); if (index >= 0){ value.splice(index, 1); } $(this).combobox('setValues', value); }, onLoadSuccess: function(){ var data = $(this).combobox('getData'); var value = $(this).combobox('getValues'); var panel = $(this).combobox('panel'); panel.find('.combo-panel-checkbox').remove(); $.each(data, function(index, item){ var checkbox = $('<input type="checkbox" class="combo-panel-checkbox">').val(item.id); if (value.indexOf(item.id) >= 0){ checkbox.prop('checked', true); } checkbox.insertBefore(panel.find('.combo-panel-list')); }); }, onShowPanel: function(){ var data = $(this).combobox('getData'); var value = $(this).combobox('getValues'); var panel = $(this).combobox('panel'); panel.find('.combo-panel-checkbox').prop('checked', false); $.each(data, function(index, item){ if (value.indexOf(item.id) >= 0){ panel.find('.combo-panel-checkbox[value="'+item.id+'"]').prop('checked', true); } }); } }); ``` 注:示例代码中的get_data.php是一个返回JSON格式数据的接口,可以根据实际情况修改
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值