jQuery UI Autocomplete Widget:在“response”事件中修改响应数据没有任何效果

时间:2013-01-17 21:35:37

标签: jquery jquery-ui jquery-ui-autocomplete

来自JQuery UI docs

  

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

  

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

Hoewever,如果我在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”,它应该显示 test3 test4 作为我的自动完成选项,但事实并非如此。我得到 test1 test2

我错过了什么?

我正在使用版本1.9.2,以防您想要指向this thread

1 个答案:

答案 0 :(得分:11)

如果您尝试使用source属性设置搜索来源,而不是拦截response,该怎么办?请看this fiddle

它基本上是这样做的:

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

P.S。它来自这个问题:Detecting no results on jQuery UI autocomplete

编辑1 :好吧。如果你在响应事件中的某个时刻设置了console.log(比如in this example),它会告诉你ui.content有两个元素,即使搜索没有返回结果。所以,看起来问题是在回调中发送更新的ui。还在看......

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

The fiddle

我只是使用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建议的解决方案,因为它也可以正常工作(如果原始内容数组太大则没有检查是否需要更长的时间)。

The fiddle with splice

它改变整个流行音乐并用一个拼接推动前一个方法。

 ui.content.splice(0, ui.content.length, { 'label': 'test3', 'value': 'test3' });