我找到了一种获取您正在寻找的信息的方法,但希望这不是最好的方法或唯一的方法。
$(this).autocomplete({
select: function(event, ui){
// blah
},
open: function(event, ui) {
console.log($(this).next().next().children());
}
});
打开事件是“在打开或更新建议菜单时触发” 。此时,自动完成小部件已经创建了带有自己的点击侦听器的 dom 元素,<input>
以便在自动完成附加到之后进行选择。(还有一个<span>
created,这就是我调用.next()
两次的原因。)但是 open 函数中的那行代码将返回您在其中创建的<li>
子节点的列表。<ul>
与您的示例相匹配,您将获得<li>
以下 HTML 标记的 jQuery 元素集合:
<li class="ui-menu-item" role="presentation">
<a id="ui-id-0" class="ui-corner-all" tabindex="-1">apple</a>
</li>
<li class="ui-menu-item" role="presentation">
<a id="ui-id-1" class="ui-corner-all" tabindex="-1">pear</a>
</li>
<li class="ui-menu-item" role="presentation">
<a id="ui-id-2" class="ui-corner-all" tabindex="-1">orange</a>
</li>
重要提示:这里的id
标签不是元素的数字索引。相反,它是原始源中元素的绝对 ID。因此,您无法保证它们是连续的。例如,如果原始来源实际上是 this: ,那么结果数据的标签["apple", "banana", "pear", "starfruit", "grape", "orange"]
ID实际上是 apple: 、 pear: 、 orange: 。您不能依赖此 id 为您提供用户在列表中单击的项目的顺序,因为它是绝对源而不是相对于结果集。<a>
ui-id-0
ui-id-2
ui-id-5
(我的列表中的 id 最初也是从 1 开始的,正如 Hogan 指出的那样,它们从 0 开始。)
在这一点上,你可以做两件事中的一件来帮助你完成剩下的工作。第一个是将集合(原始的或转换的,如对象格式)存储在某个变量中,该变量将在select
事件回调的范围内。我建议将列表转换为如下对象:
lastResultSet = {
apple : 1,
pear : 2,
orange : 3
}
然后你的.select
代码可以这样做:
var selectedIndex = lastResultSet[$(this).val(ui.item.value)];
另一种方法是在 dom 元素上设置自己的.click
回调<li><a>
以在该点捕获索引。我不建议这样做,因为在<li>
dom 元素被自动完成破坏之前,如果不让点击处理程序解除绑定和处置,很容易干扰自动完成行为或导致内存泄漏。
无论如何,我建议您在jQuery UI 论坛或 IRC 支持频道上提出同样的问题,希望有人可以为您提供一个不那么脆弱地依赖于隐含的 Dom 元素顺序的答案。