在jQuery UI v1.8rc3中,
自动完成小部件接受一个
source选项,可以是字符串、数组或回调函数。 如果是一个字符串,自动完成将在该URL上执行GET以获取选项/建议。 如果是数组,则自动完成会搜索任何位置的术语中是否存在键入的字符,正如您所指出的那样。 最终的变体是您想要的-回调函数。
来自自动完成文档:
第三个变体,回调提供了最大的灵活性,并且可用于将任何数据源连接到自动完成。 回调获取两个参数:
•一个request对象,带有一个名为“term”的属性,该属性引用当前在文本输入中的值。 例如,当用户在设置为进行自动完成的城市字段中输入“new yo”时,request.term将保持“new yo”。
•response函数,一个回调函数,它期望一个单一的参数包含要向用户建议的数据。 这些数据应基于提供的术语进行过滤,并且必须是允许简单本地数据的格式的数组:具有标签/值/两个属性的String-Array或Object-Array。
示例代码:
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({
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);
来转义搜索词,这样用户输入的文本中任何在正则表达式中有意义的术语都将被视为纯文本。例如,句点(.)在正则表达式中是有意义的。我通过阅读自动完成源代码学习了这个escapeRegex函数。
- 带有
new Regexp()
的行指定以^(Circumflex)开头的正则表达式,这意味着只有在数组中的术语以所键入的字符开头时才会匹配,这正是您想要的。它还使用“i”选项,这意味着进行不区分大小写的匹配。
-
$.grep()
实用程序只对提供的数组中的每个术语调用提供的函数。在这种情况下,该函数仅使用正则表达式来查看数组中的项是否与所键入的内容匹配。
- 最后,responseFn()使用搜索结果调用。
工作演示:
http://jsbin.com/ezifi
它的样子是这样的:
![alt text](https://istack.dev59.com/JwMXL.webp)
只是提醒一下:我认为自动完成功能的文档目前还比较不成熟。我没有找到能够做到这一点的示例,也没有找到哪些 .css 文件是必需的或将使用哪些 .css 类。我是通过检查代码来学习所有这些知识的。
另请参阅
如何自定义格式化Autocomplete插件结果?。