Почему $ (window) .on ('beforeunload', обратный вызов);больше не запускает мой вызов ajax в Chrome после обновления до 73.0.3683.103? - PullRequest
0 голосов
/ 13 апреля 2019

В нашем веб-приложении мы используем вызов ajax, который запускается по событию beforeunload, чтобы отследить, продолжает ли пользователь работать с определенной частью информации. Это выглядит примерно так:

$(window).on('beforeunload', function() {
    $.ajax({
               async: false,
               url: "../orderInformation/assignOrder",
               data: {
                   orderId: orderId,
                   shouldAssign: false
               }
           });
    console.info("Handled beforeunload");
});

До сегодняшнего дня это работало нормально в Chrome, IE и Firefox. Начиная с версии Chrome 73.0.3683.103, вызов Ajax больше не запускается, хотя остальная часть JS в этом обработчике выполняется. То есть сообщение выводится на консоль.

Панель инструментов разработчика Chrome не показывает вызов AJAX, выполняемый в версии 73.0.3683.103, и я подтвердил, что наш веб-сервер также не получил запрос. Однако, когда я запускаю тот же код в Chrome 73.0.3683.86, он запускает запрос Ajax, и веб-сервер получает его! Я подтвердил, что это изменение касается как Mac OS, так и Windows.

Что изменилось в Chrome 73.0.3683.103, что вызвало эту проблему? И / или как мне это исправить?

На это обратили наше внимание ряд обращений в службу поддержки от наших клиентов, поскольку это отрицательно сказалось на работе нашего приложения. Впервые за свою 11-летнюю карьеру в качестве разработчика веб-приложений мне пришлось просить наших пользователей перейти на Internet Explorer.

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Я тоже столкнулся с этим.Я нашел твит, в котором говорится, что поддержка синхронного xhr была удалена из событий отклонения страниц в Blink, который является механизмом браузера, используемым Chrome.Это случилось в начале апреля.Весьма вероятно, что Chrome 73.0.3683.103 работает на версии Blink, в которой это удалено.sendBeacon и fetch keepalive - это новые рекомендуемые методы запуска ajax на pageunload.

рассматриваемый твит

0 голосов
/ 17 апреля 2019

Мой обходной путь с использованием маяка - асинхронный вызов

Не ответ, но это решение: я использовал подсказки, приведенные в комментариях к вопросу, чтобы придумать следующее исправление. Я добавил это выше существующего кода, поэтому существующий код является запасным вариантом. Обратите внимание, что использование маяка вызовет асинхронный вызов.

if (navigator && navigator.sendBeacon) {
    navigator.sendBeacon(url);
    return;
}

Обходной путь, упомянутый Ильдаром Файзовым - синхронный вызов

Я не проверял это, но, по сообщениям, это работает и выполняет синхронный вызов ajax.

var img = document.createElement('img');
img.src = url;
document.body.appendChild(img);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...