1

我有一个“自动建议”输入。在setTimeout函数中的keyup将发出一个 ajax 请求。如果输入了密钥,则需要进行搜索,并且应该隐藏建议。

问题是,如果我输入得足够快,当按下回车键时,“自动建议”仍然会显示。我猜第二个 keyup(enter) 是在第一个处理程序有机会停止执行之前触发的,所以首先触发搜索,然后才触发“自动建议”。

如何防止程序返回并执行第一个处理程序?

编辑

这是代码的一部分:

    searchTextInput.bind("keyup.qssb", function(event){
      clearTimeout(suggestTimeout);
      switch(event.keyCode){
        case 40: <select option down>; break;
        case 38: <select option up>; break
        case 13: jQuery(widget).trigger("search"); break;
        default: <do some things>;
                 suggestTimeout = setTimeout(startSearch, 200); break;
      }
    });
4

2 回答 2

1

假设问题确实是您所描述的,那么您可以(一起)做两件事来解决它:

  1. 当您发送 ajax 请求时,您将存储对该请求的引用。当您收到另一个keyup时,取消该 ajax 请求。

  2. 当您开始执行onEnter处理程序时,设置一些变量以指示不再需要自动建议。在自动建议处理程序中,在您的 ajax 返回后,仅在未设置该变量时显示建议。

本质上,您的代码结构将是这样的(请注意,这是伪代码,并不打算复制到您的应用程序中)

var ajaxReq == null;
var needSuggestions = true;

$('#textfield').on("keyup", function(e) {
    if(ajaxReq != null) {
        ajaxReq.abort();
        ajaxReq = null;
    }

    if(key is enter) {
        needSuggestions = false;
        execute search;
    }
    else {
        ajaxReq = $.ajax(...,
            done: function() { ajaxReq = null; }
            success: function(data) {
                if(needSuggestions) {
                    display suggestions;
                }
            }
        );
    }
}
于 2013-08-08T13:48:12.420 回答
0

这是去抖动功能的绝佳用例。仅当用户停止输入 300 毫秒时才开始请求自动建议。参见_.debounce()例如

于 2013-08-08T13:48:27.037 回答