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, но это зависит от вас