jQuery:在页面卸载时自动中止 AjaxRequests?

jQuery: Automatically abort AjaxRequests on Page Unload?

提问人:Eli 提问时间:3/2/2009 更新时间:4/16/2016 访问量:16606

问:

感谢您的阅读。

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

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

我正在寻找类似的东西:

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

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

jQuery AJAX

评论


答:

1赞 Sergey Galashyn 3/2/2009 #1

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

10赞 Luca Matteis 3/2/2009 #2

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

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

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

评论

0赞 taber 9/14/2009
我收到一个 js 错误“myajax.abort”不是一个函数 (jquery 1.3.2) 有人驯服了“中止野兽”吗?
0赞 taber 9/14/2009
编辑:我认为这是因为我在$.ajax(...)调用结束时使用了“.responseText”。我拿出了.responseText,现在没有错误。耶。
0赞 Badiparmagi 12/19/2017
unload方法已在 Jquery 中删除 :/
4赞 servermanfail 5/7/2012 #3

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

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

2赞 Vitalii Ivanov 1/22/2015 #4

您必须保留所有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 弹出已完成的请求,但这取决于您

8赞 yourpublicdisplayname 9/8/2015 #5

以下代码经过测试,并在 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);
};

评论

0赞 dhc 4/15/2016
这很好用。您的 ajax 函数仍将因中止而调用,因此请确保测试您是否正在记录控制台错误等......errortextStatus!='abort'
0赞 yourpublicdisplayname 4/16/2016
我已经添加了这个的最新版本。原始代码有一个 while() 循环,只有在没有 xhr 对象时才退出。但是,这将在列表中找到空 xhr 条目,并且在某些情况下会出错。
0赞 Another Weeb 1/25/2023
对不起,问了。通过这个:将以下内容作为第一个jQuery就绪处理程序,您的意思是像这样使用它=> $(onPageLoaded).ready(...)?