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

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

  •  12
  • Eli  · 技术社区  · 17 年前

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

    我要找的东西是:

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

    5 回复  |  直到 17 年前
        1
  •  10
  •   Luca Matteis    17 年前

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

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

    var myajax = $.ajax(...); 
    $(window).unload( function () { myajax.abort(); } );
    
        2
  •  8
  •   yourpublicdisplayname    10 年前

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

    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);
    };
    
        3
  •  4
  •   servermanfail    14 年前

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

    我的理论是,Chrome需要下一页 取消任何背景ajax请求。如果您的ajax请求与您要导航的页面所在的会话相同,那么即使在第一行PHP代码被命中之前,您也会遇到死锁。

        4
  •  2
  •   Vitalii Ivanov    11 年前

    您必须持久化所有ajax请求,并在重新加载页面时中止所有请求。样品

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

    在代码中的某个地方

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

        5
  •  1
  •   Sergey Galashyn    17 年前

    我想你需要 window.onunload AjaxRequestX=$.get(…) 对于每个请求,可以将对象保留在数组中,并在卸载时遍历它们。