1

「自動提案」入力があります。setTimeout関数でキーアップすると、ajax リクエストが行われます。キーがEnterの場合、検索が必要であり、候補は非表示にする必要があります。

問題は、十分に速く入力すると、 Enterキーを押したときに「自動提案」がまだ表示されることです。最初のハンドラーが実行を停止する前に2 番目の 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

問題が実際にあなたが説明したものであると仮定すると、それに対処するために (一緒に) できることが 2 つあります。

  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 に答える