jQuery UI Autocomplete在进入迄今为止搜索的术语时不会触发搜索

我有一个jQuery UI Autocomplete控件,当minLength = 3时触发Ajax请求。问题如下:假设我输入“fic”作为初始搜索词 – 这很好。 请求触发并返回结果。 我决定不想选择任何结果,然后再次重新输入相同的搜索(fic)。 这次没有Ajax请求开火!

我的代码如下所示:

// ... do request $("#reportSearch").autocomplete({ delay: 50, minLength: 3, source: function(q, add){ $.ajaxSetup ({ cache: false}); $.ajax({ type: "GET", url: K_URL_REQUEST 

所以基本上在我上面描述的第二个场景中没有触发“源”回调。 似乎这样做的原因是自动完成控件保留在前一个搜索词上,因为它匹配 – 没有触发搜索:

 // Taken from jquery-ui-1.8.4.custom.min.js if (a.term != a.element.val()) { // *** THE MATCH IS HERE //console.log("a.term != a.element.val(): "+a.term+", "+a.element.val()); a.selectedItem = null; a.search(null, c) // *** SEARCH IS TRIGGERED HERE } 

为了使每次触发,我只需在搜索返回后将搜索项重置为null。 这种方式按预期工作。

事情是我不明白这种行为。 我认为每次搜索都应该是截然不同的。 没有缓存(或者不应该是缓存)。

所以虽然我已经解决了我的问题,但我仍然觉得我在这里错过了一些东西。

任何人的想法? 提前致谢!

我找到了解决这个问题的方法(对于info,我使用的是jQuery UI 1.8.4)

jquery-ui-1.8.4.custom.js中的Autocomplete实现有一个定义为_change的方法。 通过注释掉if语句,控件始终发送请求。

 ..., _change: function(event) { //if (this.previous !== this.element.val()) { this._trigger("change", event, { item: this.selectedItem }); //} }, ... 

而是更改jquery.ui,您可以尝试删除属性“previous”的值,执行以下操作:
$(this).data()。autocomplete.previous = null;

我已经设法通过在jquery ui autocomplete的源代码中注释掉这个if语句来解决这个问题。

 // keypress is triggered before the input value is changed clearTimeout( self.searching ); self.searching = setTimeout(function() { // only search if the value has changed //if ( self.term != self.element.val() ) { self.selectedItem = null; self.search( null, event ); //} }, self.options.delay ); 

从JQuery UI 1.8+开始,您可以使用窗口小部件工厂来扩展所有自动完成窗口小部件的默认行为。 只需在jqueryUI之后包含带有此内容的javascript文件

 // Extend jquery UI autocomplete $.widget( "ui.autocomplete", $.ui.autocomplete, { _close: function( event ) { var ret = this._super(); // Resets previously used search term this.term = null; return ret; } }); 

这里有很棒的提示 – 这是我一直在努力的事情。

对我而言,唯一可行的解​​决方案是Duncan和Stefaan的上述答案的组合。