在 jQuery UI v1.8rc3 中,自动完成小部件接受一个源选项,它可以是字符串、数组或回调函数。如果它是一个字符串,自动完成功能会在该 URL 上执行 GET 以获取选项/建议。如您所指出的,如果是数组,则自动完成会搜索在数组项中的任何位置是否存在键入的字符。最后一个变体就是你想要的——回调函数。
从自动完成文档中:
第三种变体,回调,提供了最大的灵活性,可用于将任何数据源连接到自动完成。回调有两个参数:
• 一个request
对象,具有一个名为“term”的属性,它指的是文本输入中当前的值。例如,当用户在设置为自动完成的城市字段中输入“new yo”时,request.term
将保留“new yo”。
• 一个response
函数,一个回调函数,它期望单个参数包含要向用户建议的数据。此数据应根据提供的术语进行过滤,并且必须是简单本地数据所允许格式的数组:字符串数组或对象数组,带有标签/值/两个属性。
示例代码:
var wordlist= [ "about", "above", "across", "after", "against",
"along", "among", "around", "at", "before",
"behind", "below", "beneath", "beside", "between",
"beyond", "but", "by", "despite", "down", "during",
"except", "for", "from", "in", "inside", "into",
"like", "near", "of", "off", "on", "onto", "out",
"outside", "over", "past", "since", "through",
"throughout", "till", "to", "toward", "under",
"underneath", "until", "up", "upon", "with",
"within", "without"] ;
$("#input1").autocomplete({
// The source option can be an array of terms. In this case, if
// the typed characters appear in any position in a term, then the
// term is included in the autocomplete list.
// The source option can also be a function that performs the search,
// and calls a response function with the matched entries.
source: function(req, responseFn) {
var re = $.ui.autocomplete.escapeRegex(req.term);
var matcher = new RegExp( "^" + re, "i" );
var a = $.grep( wordlist, function(item,index){
return matcher.test(item);
});
responseFn( a );
}
});
几个关键点:
- 对
$.ui.autocomplete.escapeRegex(req.term);
That的调用会转义搜索词,以便用户键入的文本中的任何正则表达式有意义的词都被视为纯文本。例如,点 (.) 对正则表达式有意义。我通过阅读自动完成源代码了解了这个 escapeRegex 函数。
- 与
new Regexp()
. 它指定了一个以 ^ (Circumflex) 开头的正则表达式,这意味着只有当键入的字符出现在数组中术语的开头时,它才会匹配,这正是您想要的。它还使用“i”选项,这意味着不区分大小写的匹配。
- 该
$.grep()
实用程序只是在提供的数组中的每个术语上调用提供的函数。本例中的函数仅使用正则表达式来查看数组中的术语是否与键入的内容匹配。
- 最后,使用搜索结果调用 responseFn()。
工作演示:http: //jsbin.com/ezifi
它看起来像什么:
请注意:我发现关于自动完成的文档目前还很不成熟。我没有找到这样做的示例,也找不到关于哪些 .css 文件是必要的或将使用哪些 .css 类的工作文档。我从检查代码中学到了这一切。
另请参阅,如何自定义格式自动完成插件结果?