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