有一种简单的方法可以实现这一点,即利用open
事件。您可以让客户端代码处理选择默认项目,或发送带有您想要选择的项目的额外属性。我将讨论这两个选项:
从术语开始的建议重点,根据客户选择:
$("input").autocomplete({
source: /* ... */,
open: function (event, ui) {
var menu = $(this).data("uiAutocomplete").menu
, i = 0
, $items = $('li', menu.element)
, item
, text
, startsWith = new RegExp("^" + this.value, "i");
for (; i < $items.length && !item; i++) {
text = $items.eq(i).text();
if (startsWith.test(text)) {
item = $items.eq(i);
}
}
if (item) {
menu.focus(null, item);
}
}
});
基本上,这个想法是在自动完成的菜单打开时执行以下操作:
- 构建一个正则表达式来查找以搜索词开头的词。
- 遍历每个菜单项并根据正则表达式测试其文本。如果我们找到匹配项,则停止迭代并存储该值。
- 如果我们检索到一个值,请使用
focus
菜单上的方法突出显示该项目。
示例: http: //jsfiddle.net/J5rVP/40/(尝试搜索E nglish 或S cots English)
该代码使用本地数据源,但它应该与远程源一样工作。
以术语开头的建议焦点,在服务器上选择
扩展上面的示例,您可以调整向下发送数据的方式,以便在每次搜索时您的服务器端代码决定选择哪个项目。您可以通过简单地在您希望选择的项目上指定一个附加属性来做到这一点。例如,您的 JSON 响应可能如下所示:
[{"label":"American English","select":true},{"label":"British English"},{"label":"English"},{"label":"Scots English"}]
注意select
“美式英语”的属性。这表示自动完成我们希望默认选择该项目。
然后您将更新您的小部件初始化代码以利用上述open
事件。虽然这一次我们只是在搜索具有以下select
属性的项目:
$("input").autocomplete({
source: "autocomplete.php",
open: function (event, ui) {
var menu = $(this).data("uiAutocomplete").menu,
i = 0,
$items = $('li', menu.element),
item,
data;
for (; i < $items.length && !item; i++) {
data = $items.eq(i).data("ui-autocomplete-item");
if (data.select) {
item = $items.eq(i);
}
}
if (item) {
menu.focus(null, item);
}
}
});
示例:http: //jsfiddle.net/J5rVP/42/
请注意,在上面的示例中,始终选择美式英语。由于每次用户键入时自动完成都会发出一个新请求,因此您的服务器将响应不同的建议数据,因此选择不同的项目。
另外我不了解 PHP,所以我无法谈论如何实现将select
属性添加到 JSON。看起来它会很简单,甚至可能看起来像第一个示例中使用正则表达式的 JavaScript 代码。