当存在中止调用时触发jQuery的ajaxStop事件

时间:2010-06-28 04:27:42

标签: jquery xmlhttprequest abort

每当ajax请求处于活动状态时,我都使用jQuery的ajaxSend和ajaxStop来显示一个微调器。它的工作原理除非我的一些插件中止了他们的ajax请求,ajaxStop不会触发,直到页面刷新后才会触发。似乎中止的请求仍然依赖于jQuery。 我可以制作ajaxStop触发器还是有更好的方法?

3 个答案:

答案 0 :(得分: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 :(得分: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或应用上面Jake发布的补丁。此外,我必须按照以下方式修改补丁,然后才能正常使用我的用例:

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--;
  }
};

答案 2 :(得分:1)

我会使用complete事件 - 无论如何都会运行:

  

完成(本地活动)
此活动是   无论是否请求,都会调用   成功与否。你会   总是得到一个完整的回调,   甚至是同步请求。

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

不确定是否需要此功能,但可以触发ajaxStop事件。 $(this).trigger('ajaxStop');