存在中止调用时触发 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 deferred 中止 AJAX 请求链