Может ли использовать beforeloadload / unload для надежной отправки XmlHttpRequests

недавно у меня было срочное требование предоставить моему серверу уведомление, что определенная страница моего webapp собирается закрыться. « Легкий peasy », – подумал я, beforeunload доступна довольно beforeunload . HTML5 «вещь» даже обновила спецификацию (вот что я подумал …) об этом, так, что у нас была возможность return значение строки из beforeunload события beforeunload и т. Д., Что дает пользователю возможность перехватывать.

См. Страницу MDN о onbeforeunload

Однако, как оказалось, нет никакой « официальной » спецификации, которая описывает поведение для beforeunload до этой даты. Единственный официальный документ, который я нашел, был на WHATWG , который, конечно же, является лишь предложением W3C.

См. WHATWG

Все идет нормально. Мы можем создать синхронизированный запрос beforeunload обработчике события beforeunload . «Большинство» браузеров, дайте этому запросу таймфрейм около 1-2 секунд, чтобы завершить, после чего его убивают. Стандартный asynchronous запрос немедленно уничтожается. Сказав это, я даже не могу сказать, «где» я знаю это, похоже, что сплетни и из уст в уста смотрят на него сейчас. Даже это, он работает в Firefox + Chrome, мы не можем полагаться на это, не так ли?

Есть ли какие-либо текущие обсуждения / предложения по WHATWG о beforeunload ?
Какие-либо другие официальные ресурсы о событии, которое я, возможно, не нашел?

И что самое важное для меня здесь, насколько надежно мы можем отправлять данные через sync-XHR?

Взгляните на navigator.sendBeacon() , который позволяет надежно отправлять данные на сервер, даже когда страница выгружается. В настоящее время он находится в черновике спецификации и поддерживается Firefox 31, Chrome 39 (за флагом от 37), за флагом в Opera 24.

Вы можете «сортировать» его полифоры, используя что-то вроде следующего:

 navigator.sendBeacon = navigator.sendBeacon || function (url, data) { var xhr = new XMLHttpRequest(); // Need to send synchronously to have the best chance of data getting // through to the server xhr.open('POST', url, false); xhr.send(data); }; 

Дальнейшее чтение:

  • Статья в HTML5 Rocks

beforeunload иметь в виду, что beforeunload запускается как расширение Internet Explorer. Автоматически это делает его вторым classом в Интернете. Спецификации не существует, и реализация браузера меняется. Например, Firefox лишь частично реализует его, не отображая строку, а только общее сообщение.

Кроме того, даже когда он полностью реализован, он не защищает от всех возможных сценариев разгрузки, например, когда пользователь завершил работу процессора, браузер потерпел крах или компьютер был отключен. Даже игнорируя эти экстремальные сценарии, я подозреваю, что может быть возможно настроить ваш браузер, чтобы игнорировать такие запросы.

Я чувствую, что вы не должны полагаться на это сообщение, чтобы спасти вас. Если это веб-приложение является внутренним, я бы предложил обучить их использованию кнопок « Save или « Close или что-то еще, а не просто закрыть вкладку. Если это внешний вид, возможно, посмотрите на автоматическое сохранение, поскольку пользователь делает свою работу?

Sync XHR является ведущим источником зависаний браузера, на который приходится почти 10% зависаний: http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/do-not-use-xmlhttprequest-in не -задний ВОМ синхронный режим, если вы-как-на-hang.aspx

В IE даже синхронизация XHR может быть «прервана», если запрос требует проверки подлинности Windows для проверки подлинности или если отправляется тело POST. Вы можете обнаружить, что отправляются только заголовки первого неаутентифицированного запроса.