2016-03-22 87 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); 
    } 
}); 

什麼都不會做,因爲只有當請求得到的迴應是successerrorcomplete回調火災。所以,在這裏放棄是沒有意義的。

我建議你結合使用定時setTimeout()clearTimeout()

$(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功能。我需要確認我無法在ajaxSetup中放棄先前的ajax請求? – Shesha

+0

你可以在'beforeSend:callback'中做到這一點。 – Jai

+0

好的罰款。我正在使用網格,所以ajaxsetup beforeSend將不適用於我。感謝您的解決方案。 :) :) – Shesha