代码之家  ›  专栏  ›  技术社区  ›  Jake

当存在中止的调用时触发jquery的Ajaxstop事件

  •  3
  • Jake  · 技术社区  · 14 年前

    我使用jquery的ajaxsend和ajaxstop在ajax请求处于活动状态时显示微调器。它可以工作,除非我的一些插件中止它们的Ajax请求,否则Ajaxstop不会触发,直到刷新页面后才会触发。似乎中止的请求仍然对jquery有效。 我能做AJAXSTOP触发器还是有更好的方法?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jake    14 年前

    我想出了一个我很喜欢的方法。修补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
  •  2
  •   mozey    14 年前

    这似乎只是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
  •  1
  •   Dan Heberden    14 年前

    我会用 complete 事件-无论发生什么:

    完成(本地事件)
    本次活动是 无论请求是否 是成功还是失败。你会 总是收到完整的回调, 即使是同步请求。

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

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