2016-03-22 9 views
3

私のアプリケーションには検索ボックスがあります。ユーザーが検索ボックスに単語を入力している間に結果を表示する必要があります。このために私はすべての以前のリクエストを中止し、最後のリクエストの結果をグリッドで表示する必要があります。jqueryの前のすべてのリクエストを中止します

グリッドを使用しているため、グリッドの「beforeSend」イベントはjquery beforeSendイベントをオーバーライドします。だから私は

<script type="text/javascript"> 
$(function() { 
    $.xhrPool = []; 
    grid.Adaptor.prototype.beforeSend = function (jqXHR) { 
     $.xhrPool.push(jqXHR); 
    } 
    $.xhrPool.abortAll = function() { 
     $(this).each(function (i, jqXHR) { 
      jqXHR.abort(); 
      $.xhrPool.splice(i, 1); 
     }); 
    } 
    $.ajaxSetup({ 
     complete: function (jqXHR) { 
      var i = $.xhrPool.indexOf(jqXHR); 
      if (i > -1) $.xhrPool.splice(i, 1); 
     } 
    }); 
}) 

、コードの下に使用しかし、私はxhrPoolに要求をプッシュすることができますが、私は以前の要求を中止することはできません。

注:$.xhrPool.abortAll = function() {ブレークポイントを配置しても、これは当てはまりません。

ここには何がありますか?

+1

。 JavaScriptインタープリタがそのメソッド自体を呼び出すと思いますか? – undefined

+0

http://stackoverflow.com/a/8841412/1982680これを試してみてhttp://jsfiddle.net/s4pbn/148/ –

+0

'$ .xhrPool.abortAll'を呼び出すコードはどこですか? –

答えて

1

ユーザーが検索ボックスに単語を入力している間に結果を表示する必要があります。これについては私は前のすべてのリクエストを中止する必要がありますの最後のリクエストの結果をに表示してください。

あなたのコード:

$.ajaxSetup({ 
    complete: function (jqXHR) { 
     var i = $.xhrPool.indexOf(jqXHR); 
     if (i > -1) $.xhrPool.splice(i, 1); 
    } 
}); 

要求がsuccessまたはerrorような応答を持っているだけで、このcompleteコールバック火災など何もしません。だからここで打ち切ることは意味をなさない。

私はあなたがclearTimeout()と一緒に、時限setTimeout()を使用することをお勧め:あなたは配列オブジェクトにメソッドを追加する

$(function() { 
    var time; 

    $('input').keydown(function(e){ 

    if(time){ 
     // before hitting the ajax 
     // clear the timeout if there is/are 
     clearTimeout(time); 
    } 

    time = setTimeout(function(){ 
     // here put the ajax code. 
    },600); 

    }); 

}) 
+0

これは、setTimeOut関数を追加すると機能します。以前のajaxリクエストをajaxSetupで中止できないことを確認する必要がありますか? – Shesha

+0

これは 'beforeSend:callback'で行うことができます。 – Jai

+0

大丈夫です。私はグリッドを使用しているので、ajaxsetup beforeSendは私にとってはうまくいかないでしょう。ソリューションに感謝します。 :) :) – Shesha