3

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

4

3 回答 3

3

好吧,我想出了一个我很喜欢的方法。修补 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" );
};
于 2010-06-29T03:56:48.683 回答
2

对于 dataType = "json",这似乎只是 jQuery 1.4.2 中的一个问题,请参阅http://forum.jquery.com/topic/ajaxstart-not-fired-when-jquery-active-changes-from-0-到-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--;
  }
};
于 2011-03-19T15:38:26.450 回答
1

我会改用完整的事件 - 无论如何都会运行:

完成(本地事件)
无论请求是否成功,都会调用此事件。您将始终收到完整的回调,即使是同步请求也是如此。

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

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

于 2010-06-28T04:47:37.240 回答