【问题标题】:jQuery UI Autocomplete not triggering a search when entering a hitherto searched for term输入迄今为止搜索的术语时,jQuery UI自动完成不会触发搜索
【发布时间】:2011-04-26 17:50:42
【问题描述】:

我有一个 jQuery UI 自动完成控件,它在 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
}


为了让它每次都能触发,我只是在搜索返回后将搜索词重置为空。这样它就按预期工作了。

问题是我不理解这种行为。我会认为每个搜索都应该是不同的。没有缓存(或者无论如何都不应该)。

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

有什么想法吗?提前致谢!

【问题讨论】:

  • 您的 [ search ](docs.jquery.com/UI/Autocomplete#event-search) 活动是什么样的?据我了解,自动完成应该在您的第二种情况下触发。
  • 注意如何输入jav删除它,然后再次输入,它仍然可以与这个演示一起工作==> jsfiddle.net/KFrQm
  • 嗨,彼得 - 我没有搜索活动。没有必要开始搜索。你对这个例子是正确的。我之前意识到这一点 - 唯一的区别是我的来源是一个 ajax 请求。
  • 这里的 jQuery 自动完成示例:jqueryui.com/demos/autocomplete 操作不一致。输入“d”,它会找到结果“ColdFusion”。如果退格删除“d”,请单击离开,然后再次单击文本框内并输入“d”,有时它什么也找不到。
  • 嗨 Peet,有没有一个版本的 jquery-ui-autocomplete 有这个修复?你能指点我吗?如果没有,请发送我必须添加到 1.8.9 jquery-ui 的代码的 sn-p 来解决这个问题,因为我也遇到了这个问题。谢谢

标签: javascript jquery autocomplete


【解决方案1】:

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

【讨论】:

  • 我在 jquerymobile 自动完成中面临同样的问题这里是链接stackoverflow.com/q/18798630/2307391
  • gezequiel 的回答对我有用,只是在我的情况下它是:$(this).data().autocomplete.term = null;
  • 在 jQuery ui 1.10.2 $(this).data().uiAutocomplete.term = null; 上为我工作
  • 使用API​​而不是修改源代码是更好的方法!
【解决方案2】:

我已经找到了解决这个问题的方法(仅供参考,我使用的是 jQuery UI 1.8.4)

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

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

【讨论】:

  • 可以确认这与 Stefaan 的答案在 1.8.14 中结合使用。谢谢。
【解决方案3】:

我已经通过在 jquery ui 自动完成的源代码中注释掉这个 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 );

【讨论】:

    【解决方案4】:

    从 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;
        }
    });
    

    【讨论】:

      【解决方案5】:

      这里有很棒的提示 - 这是我一直在努力解决的问题。

      对我来说,唯一有效的解决方案是结合上述邓肯和斯蒂芬的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 2017-06-21
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        相关资源
        最近更新 更多