【发布时间】:2011-03-10 01:23:22
【问题描述】:
我正在使用带有本地数据源 (source: myArray) 的 jQuery UI 自动完成功能。我希望自动完成仅提出 以 输入的字符串而不是默认的 不区分大小写的包含 搜索的结果。是否有一个简单的解决方案或者我必须提供我的自定义搜索/源回调?
【问题讨论】:
标签: jquery jquery-ui autocomplete
我正在使用带有本地数据源 (source: myArray) 的 jQuery UI 自动完成功能。我希望自动完成仅提出 以 输入的字符串而不是默认的 不区分大小写的包含 搜索的结果。是否有一个简单的解决方案或者我必须提供我的自定义搜索/源回调?
【问题讨论】:
标签: jquery jquery-ui autocomplete
看这个:
匹配起始词:
http://blog.miroslavpopovic.com/jqueryui-autocomplete-filter-words-starting-with-term
他覆盖了自动完成过滤器方法。我用这个,效果很好。
// Overrides the default autocomplete filter function to search only from the beginning of the string
$.ui.autocomplete.filter = function (array, term) {
var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i");
return $.grep(array, function (value) {
return matcher.test(value.label || value.value || value);
});
};
匹配词:
匹配字符串中任何单词的startsWith。
例如“LHR london”与“london”匹配
var matcher = new RegExp("\\b" + $.ui.autocomplete.escapeRegex(term), "i");
\b 在单词边界处断言位置 (^\w|\w$|\W\w|\w\W)
【讨论】:
if(userInputsNumber) { useDefault; } else { useStartsWith(); }
您可以使用相同的方式进入Jquery UI Autocomplete Examples
<script>
$("#autocompleteInputField").autocomplete({
source: function(request, response) {
var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i");
response($.grep(myArray, function(item){
return matcher.test(item);
}) );
}
});
</script>
OR 使用$.map 方法而不是$.grep 的另一种方式
<script>
$("#autocompleteInputField").autocomplete({
source: function(request, response) {
var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i");
response($.map(myArray, function(item) {
if (matcher.test(item)) {
return (item)
}
}));
}
});
</script>
【讨论】:
这里有一种略有不同的区分大小写搜索的方法。请注意,在第二个示例中创建正则表达式时缺少“i”,这是导致默认实现不区分大小写的原因。
不区分大小写:
$('#elem').autocomplete({
source: array
});
区分大小写:
$('#elem').autocomplete({
source: function(request, response) {
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term, ""));
var data = $.grep( array, function(value) {
return matcher.test( value.label || value.value || value );
});
response(data);
}
});
【讨论】:
source: function( request, response ) {
var t = jQuery.grep(t, function(a){
var patt = new RegExp("^" + request.term, "i");
return (a.match(patt));
});
response(t);
},
【讨论】:
我进入了 Jqueryui 代码并将其切换到那里。
如果您查看自动完成部分,您将看到以下行:
filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i")
将其修改为以下内容(注意,这是全局更改):
filter:function(a,b){var g=new RegExp("^" + d.ui.autocomplete.escapeRegex(b),"i")
【讨论】:
目前我是这样做的,不知道有没有更好的解决方案:
source: function(request, response) {
var filteredArray = $.map(orignalArray, function(item) {
if( item.value.startsWith(request.term)){
return item;
}
else{
return null;
}
});
response(filteredArray);
},
这种方法还可以对要显示的项目数量施加限制(例如 10 个项目)。
【讨论】: