Выгрузка jQuery с помощью вызова AJAX не работает в Chrome - PullRequest
2 голосов
/ 30 ноября 2011

Это мой очень простой фрагмент кода:

$(window).unload(function() {
        $.ajax({
            url: 'stats_pages.php?last_id='+$("#last_id").val(),
        });
});

Достаточно просто. Вызов AJAX прекрасно вызывается в Firefox, но в Chrome происходит сбой. Я пробовал другие варианты, которые работают:

window.onbeforeunload = function(){
        $.ajax({
            url: 'stats_pages.php?last_id='+$("#last_id").val(),
        });
        return false;
}

Это работает в Chrome, но предупреждает «false» с обычным «Вы уверены, что хотите покинуть эту страницу?» сообщение, которое не то, что я хочу, очевидно. Без return false; он не запускает вызов AJAX.

В идеале мне больше всего нравится первое решение, но кто-нибудь знает, что происходит?

Ответы [ 3 ]

11 голосов
/ 30 ноября 2011

Установить ASYNC: false в вашем вызове ajax

$(window).unload(function() {
        $.ajax({
            url: 'stats_pages.php?last_id='+$("#last_id").val(),
            async : false,
        });
});
2 голосов
/ 04 мая 2012

На сегодняшний день это все еще не получится с более новыми версиями Chrome. Проблема с событием unload и Chrome. Похоже, что это проблема с Chrome 14. Вы можете узнать больше об этой проблеме из билета об ошибке jQuery: http://bugs.jquery.com/ticket/10509.

Существует также исправление для Chrome, указанное по ссылке выше:

window.onbeforeunload = function() { 
  $.ajax({
       url: 'stats_pages.php?last_id='+$("#last_id").val(),
       async : false,
  });
}
0 голосов
/ 10 марта 2017

Ни одно из приведенных выше решений не было приемлемым для меня.Первый, потому что асинхронные вызовы AJAX могут привести к плохому поведению клиента, если сервер работает медленно, и второй, потому что мы уже используем событие onbeforeunload, чтобы сгенерировать «Вы уверены?»сообщение для пользователей, покидающих страницу, где они внесли изменения.Я экспериментировал с setTimeout и jQuery delay (), но я пришел к выводу, что как только поток переходит в спящий режим, Chrome убивает поток, и, очевидно, вызову AJAX требуется немного времени, чтобы сформулировать запрос длябыть успешным.Таким образом, в конце концов мне удалось решить эту проблему с помощью очень низкотехнологичного цикла, который никогда не переводил поток в состояние сна и поддерживал его работу еще 50 миллисекунд.

var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > 50) {
        return;
    }
}

С этим изменениемВызов AJAX теперь корректно срабатывает в Chrome без заметной задержки на стороне клиента.

...