jQuery: автоматически прерывать AjaxRequests на странице выгрузки? - PullRequest
12 голосов
/ 01 марта 2009

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

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

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 02 марта 2009

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

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

var myajax = $.ajax(...); 
$(window).unload( function () { myajax.abort(); } );
7 голосов
/ 08 сентября 2015

Следующий код протестирован и отменяет все невыполненные запросы 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);
};
4 голосов
/ 07 мая 2012

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

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

2 голосов
/ 22 января 2015

Вы должны сохранить все ваши 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, но решать вам

1 голос
/ 02 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...