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

Posted

技术标签:

【中文标题】存在中止调用时触发 jQuery 的 ajaxStop 事件【英文标题】:Trigger jQuery's ajaxStop event when aborted calls exist 【发布时间】:2010-06-28 04:27:42 【问题描述】:

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

【问题讨论】:

【参考方案1】:

嗯,我想出了一个我非常喜欢的方法。修补 XMLHttpRequest abort 方法,这样它将减少 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" );
;

【讨论】:

【参考方案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--;
  
;

【讨论】:

【参考方案3】:

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

完成(本地事件)此事件是 不管请求是否被调用 成功与否。你会 总是收到一个完整的回调, 即使是同步请求。

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

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

【讨论】:

据我了解,complete 会在任何 ajax 事件完成时运行。这意味着如果我用它来隐藏我的微调器,它会在一个请求完成时隐藏,即使其他请求仍在运行。

以上是关于存在中止调用时触发 jQuery 的 ajaxStop 事件的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Ajax 操作函数

使用 jQuery 中止 JSONP ajax 请求

使用 jQuery deferred 中止 AJAX 请求链

Jquery Ajax 错误处理忽略中止

当 jQuery ajax 调用开始时,loadmask 没有触发

jQuery ajax 请求作为延迟 - 包装失败回调