JQuery: автоматическое прерывание AjaxRequests при разгрузке страницы?

Спасибо за чтение.

Я заметил, что если у меня есть страница с одним или несколькими запросами ajax, и я нажимаю ссылку, чтобы оставить страницу или обновить ее, она будет ждать завершения запросов ajax до разгрузки.

Это обычно не проблема, но если запрос занимает некоторое время, это может быть.

Я ищу что-то вроде:

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

чтобы автоматически прерывать запросы перед выгрузкой, но не совсем уверен, как найти запросы ajax. Будут ли они где-нибудь под окном?

Ответ 1

$. ajax() Метод jQuery возвращает объект XMLHttpRequest. Это означает, что вы можете применять стандартные методы для объекта, такие как abort().

Для выгрузки используйте встроенный метод unload jQuery.

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

Ответ 2

Следующий код проверен и прерван все выдающиеся jQuery-запросы ajax на странице разгрузки в Chrome, но он используется 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);
};

Ответ 3

У меня была эта проблема, я делал длинный цикл в PHP, который вызывается из $.ajax. Моим решением было добавить session_write_close(); перед длинным циклом.

Моя теория заключается в том, что Chrome запрашивает следующую страницу перед отменой любых фоновых запросов ajax. Если ваш запрос ajax является тем же _SESSION, что и страница, на которую вы переходите от AND TO, тогда у вас есть тупик, прежде чем ударит ваша первая строка кода PHP.

Ответ 4

Думаю, вам нужно window.onunload событие плюс AjaxRequestX = $.get(...) для каждого запроса, возможно, сохранить объекты в массиве и пройти через них при разгрузке.

Ответ 5

Вам нужно сохранить все ваши запросы ajax и когда страница перезагружает прерывание всех запросов. Пример

var _requests = [];

var _abortAllRequests = function () {
    $(_requests).each(function (i, xhr) { xhr.abort(); });

    _requests = [];
}

$(window).on("beforeunload", function () { 
    _abortAllRequests();
});

где-то в вашем коде

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

Кроме того, вы можете делать запросы с помощью $.ajaxSetup с событиями ajaxStart ajaxStop, но это зависит от вас