【问题标题】:jQuery: Automatically abort AjaxRequests on Page Unload?jQuery:在页面卸载时自动中止 AjaxRequests?
【发布时间】:2009-03-01 20:53:35
【问题描述】:

感谢阅读。

我注意到,如果我有一个打开了一个或多个 ajax 请求的页面,并且我单击一个链接离开页面或刷新它,它会在卸载之前等待 ajax 请求完成。

这通常不是问题,但如果请求需要一段时间,则可以。

我正在寻找类似的东西:

$(window).bind("beforeunload", function() {AjaxRequest.abort();});

在卸载前自动中止请求,但不太确定如何找到 ajax 请求。他们会在某个地方的窗户下面吗?

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    以下代码经过测试,并在 Chrome 中中止页面卸载时所有未完成的 jQuery ajax 请求,但 Edge 和 IE 也可以使用客户端使用它而不会出错。

    将以下内容作为第一个 jQuery ready 处理程序:

    $(onPageLoaded)
    

    并将其放在可访问的地方:

    function onPageLoaded() {
        var jqxhrs = [];
    
        $(window).bind("beforeunload", function (event) {
            $.each(jqxhrs, function (idx, jqxhr) {
                if (jqxhr)
                    jqxhr.abort();
            });
        });
    
        function registerJqxhr(event, jqxhr, settings) {
            jqxhrs.push(jqxhr);
        }
    
        function unregisterJqxhr(event, jqxhr, settings) {
            var idx = $.inArray(jqxhr, jqxhrs);
            jqxhrs.splice(idx, 1);
        }
    
        $(document).ajaxSend(registerJqxhr);
        $(document).ajaxComplete(unregisterJqxhr);
    };
    

    【讨论】:

    • 这很好用。您的 ajax error 函数仍将被调用以进行中止,因此如果您正在记录控制台错误等,请确保测试 textStatus!='abort'...
    • 我已经添加了这个的最新版本。原始代码有一个 while() 循环,只有在没有 xhr 对象时才退出。但是,这会在列表中找到 null xhr 条目,并且在某些情况下会出错。
    【解决方案2】:

    您必须坚持所有 ajax 请求,并且在重新加载页面时中止所有请求。样本

    var _requests = [];
    
    var _abortAllRequests = function () {
        $(_requests).each(function (i, xhr) { xhr.abort(); });
    
        _requests = [];
    }
    
    $(window).on("beforeunload", function () { 
        _abortAllRequests();
    });
    

    在你的代码中的某个地方

     _requests.push($.ajax(...))
    

    此外,您可以使用带有事件 ajaxStart ajaxStop 的 $.ajaxSetup 弹出完成的请求,但这取决于您

    【讨论】:

      【解决方案3】:

      $.ajax() jQuery 方法返回 XMLHttpRequest 对象。这意味着您可以在对象上应用标准方法,例如 abort()。

      要卸载使用内置的unload jQuery 事件方法。

      var myajax = $.ajax(...); 
      $(window).unload( function () { myajax.abort(); } );
      

      【讨论】:

      • 我收到一个 js 错误“myajax.abort”不是函数(jquery 1.3.2)有没有人驯服过“中止野兽”?
      • 编辑:我认为这是因为我在 $.ajax(...) 调用结束时使用了“.responseText”。我拿出了.responseText,现在没有错误了。耶。
      • unload 方法已在 Jquery 中删除:/
      【解决方案4】:

      我刚刚遇到了这个问题,我在 PHP 中进行了一个长循环,该循环是从 $.ajax 调用的。我的解决方案是添加 session_write_close();在长循环之前。

      我的理论是,Chrome 会在 取消任何后台 ajax 请求之前请求下一页。如果您的 ajax 请求与您要离开 AND TO 的页面的 _SESSION 相同,那么您甚至在第一行 PHP 代码被命中之前就会出现死锁。

      【讨论】:

        【解决方案5】:

        认为每个请求都需要 window.onunload 事件加上 AjaxRequestX = $.get(...),也许将对象保存在数组中并在卸载时通过它们.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-21
          • 2019-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多