2010-06-28 39 views
3

我已經使用jQuery的ajaxSend和ajaxStop顯示一個微調只要ajax請求活動。它可以工作,除非我的一些插件放棄了他們的ajax請求,ajaxStop不會觸發,並且只有在頁面刷新後纔會觸發。似乎中止的請求仍然計入jQuery。 我可以製作ajaxStop觸發器還是有更好的方法?觸發jQuery的ajaxStop事件當中止調用存在

回答

3

那麼我想出了一個我非常喜歡的方式。修補XMLHttpRequest中止方法,以便減少jQuery的ajax計數器,並在最後一次請求時觸發處理程序。還不確定它在不同瀏覽器上的效果如何。

var old_abort = XMLHttpRequest.prototype.abort; 
XMLHttpRequest.prototype.abort = function(){ 
    jQuery.proxy(old_abort, this)(); 
    if (jQuery.active-- === 1) 
     jQuery.event.trigger("ajaxStop"); 
}; 
1

我會用complete事件,而不是 - 運行無論什麼:

完整(本地事件)
此事件 不管請求是否 成功,或者不叫。即使對於同步請求,您將會收到完整的回叫 ,即 。

$.ajax({ 
    complete: function(){ 
    // hide your spinner 
    } 
}); 

不知道你是否需要這個,但你可以觸發的ajaxStop事件。 $(this).trigger('ajaxStop');

+0

據我所知,每當任何ajax事件完成時都會運行'complete'。這意味着如果我用它來隱藏我的微調器,當一個請求完成時即使其他人仍在運行,它也會隱藏。 – Jake 2010-06-28 07:22:28

2

這似乎只能在jQuery的1.4.2的問題進行的dataType = 「JSON」,見http://forum.jquery.com/topic/ajaxstart-not-fired-when-jquery-active-changes-from-0-to-1

升級到jQuery的1.5.1或應用由傑克貼上面的補丁。此外,我必須修改該補丁,如下所示,才能正常工作:

f_abort = XMLHttpRequest.prototype.abort; 
XMLHttpRequest.prototype.abort = function() { 
    $.proxy(f_abort, this)(); 
    if ($.active === 1) { 
    $.event.trigger("ajaxStop"); 
    $.active = 0; 
    } else if ($.active > 1) { 
    $.active--; 
    } 
}; 
相關問題