9

来自JQuery UI 文档

response事件)在搜索完成后触发,在菜单显示之前。对于建议数据的本地操作很有用。

ui.content参数)包含响应数据,可以修改以更改将显示的结果。

但是,如果我修改ui.content事件response,它不会影响下拉列表中显示的结果,而是我的代码被忽略。这是我的(测试)代码:

$('input.autocomplete').autocomplete({
    source: new Array({label: 'test1', value: 'test1'}, {label: 'test2', value: 'test2'}),
    response: function( event, ui ) {
        ui = {content: new Array({label: 'test3', value: 'test3'}, {label: 'test4', value: 'test4'})};
    }
});

理论上,如果术语是“t”,它应该显示test3test4作为我的自动完成选项,但事实并非如此。我得到test1test2

我错过了什么?

我使用的是 1.9.2 版本,以防你想把我指向这个线程

4

1 回答 1

11

如果您尝试使用source属性设置搜索的来源,而不是拦截response? 看看这个小提琴

它基本上是这样做的:

$("input.johndoe").autocomplete({
        source: [
            "test1",
            "test2",
            "test3"
            ...
            ],
        ...

PS它来自这个问题:Detecting no results on jQuery UI autocomplete

编辑1:嗯。如果您在响应事件中的某个时间点设置了一个 console.log(就像在这个例子中一样),它会告诉您 ui.content 有两个元素,即使搜索没有返回结果。因此,看起来问题在于在回调中发送更新的 ui。还在找...

编辑2:以某种方式得到它。看看这个更新的 jsfiddle。它清除内容数组并设置新的。仍然在猜测为什么它在类似的事情之后不会变空ui.content = [];,这让我有点恼火。也许它与它位于 JQuery 对象内部的事实有关(即使它被定义为一个纯粹而简单的 Array.

小提琴

我只是使用 push 方法将所需的键值组合放入数组中。

// Set default content
      for ( var i = 0; i = ui.content.length; i++ ) {
        ui.content.pop();
      }
      ui.content.push({ label: "pepe", value: "pepe" });

它有效,因为它总是显示所需的建议列表。希望它有所帮助,也许其他人会找到更优雅的解决方案。

Edit3:只是为了添加@andrewWhithaker 建议的解决方案,因为它也可以工作(如果原始内容数组太大,还没有检查是否需要更长的时间)。

带拼接的小提琴

它通过一个拼接改变了整个流行和推动以前的方法。

 ui.content.splice(0, ui.content.length, { 'label': 'test3', 'value': 'test3' });
于 2013-01-17T21:56:25.453 回答