Сбой синхронного запроса Ajax в Chrome

Последняя версия Chrome остановила синхронные вызовы Ajax? Мы получаем ошибку при выполнении синхронных вызовов Ajax. Проблема появилась после того, как мы обновили до последней версии Chrome - 73.0.3683.103. Синхронные вызовы отлично работают на Firefox и IE на данный момент. Мы получаем ошибку ниже

сообщение: "Не удалось выполнить" send "для" XMLHttpRequest ": не удалось загрузить" Path... ": синхронный XHR при закрытии страницы". имя: "NetworkError"

Может кто-нибудь предложить решение, чтобы заставить работать синхронные вызовы Ajax. У меня есть некоторые функциональные возможности, где мне нужно наверняка положиться на синхронный вызов.

2 ответа

Да, в Chrome они недавно запретили синхронный ajax во время событий конца страницы (например, beforeunload а также unload). Вы просто не можете больше этого делать в Chrome. Обновление: Вы можете снова, в v73 и v74, но это запланировано (пока), чтобы уйти снова в v75, если не будет больше откат. Следите за забавой в этом выпуске (спасибо, patmortech, что нашли эту проблему).

Современная альтернатива заключается в использовании sendBeacon Это позволяет браузеру перемещаться от страницы, в то же время давая вам возможность сообщить серверу, что происходит. Это не задерживает закрытие страницы. Но это только POST, и, поскольку он не задерживает удаление страниц, варианты использования, основанные на задержке удаления страниц, не будут работать с ним.

Спасибо вам обоим - Краудеру и Чарлиэтфлю. Использование Beacon решило проблему.

В случае, если кто-то ищет решение, можете следовать этому - http://qnimate.com/sending-data-to-server-on-page-unload/

В некоторых случаях Beacon работает нормально, но я считаю, что он очень ограничен тем, что вы можете делать и настраивать (невозможность установить заголовок нарушила мой вариант использования). Другой вариант - использоватьfetch и keepaliveфлаг установлен в значение true. По этой ссылке:

Параметр keepalive указывает, что запрос может "выжить" веб-страницу, которая его инициировала.

window.onunload = function() {
  fetch('/analytics', {
    method: 'POST',
    body: "statistics",
    keepalive: true
  });
};

Это асинхронно, но отправка маяка тоже. Меня просто раздражает, что Google навязывает это изменение и нарушает множество вариантов использования, когда мы хотим убедиться, что что-то завершено перед загрузкой...

Другие вопросы по тегам