К сожалению ответ Кангакса не работает для Safari на iOS . В моем тестировании beforeunload
поддерживался во всех браузерах, которые я пробовал, кроме Safari на IOS: - (
Вместо этого я предлагаю другой подход:
Идея проста. На самом первом посещении страницы мы еще не знаем,
beforeunload
поддерживается. Но на той самой первой странице мы создали
unload
и обработчик beforeunload
. Если обработчик beforeunload
срабатывает, мы устанавливаем
флаг о том, что beforeunload
поддерживается (на самом деле beforeunloadSupported =
"yes"
). Когда срабатывает обработчик unload
, если флаг не был установлен, мы устанавливаем
признак того, что beforeunload
не поддерживается.
В дальнейшем мы будем использовать localStorage
(поддерживается во всех браузерах, которые мне нужны
о - см. http://caniuse.com/namevalue-storage), чтобы получить / установить флаг. Мы
с таким же успехом мог бы использовать куки, но я выбрал localStorage
, потому что там
Нет причин отправлять эту информацию на веб-сервер при каждом запросе. Мы
просто нужен флаг, который выживает при перезагрузке страницы. Как только мы обнаружили это один раз, это будет
оставаться обнаруженным навсегда.
Теперь вы можете позвонить по номеру isBeforeunloadSupported()
, и он сообщит вам.
(function($) {
var field = 'beforeunloadSupported';
if (window.localStorage &&
window.localStorage.getItem &&
window.localStorage.setItem &&
! window.localStorage.getItem(field)) {
$(window).on('beforeunload', function () {
window.localStorage.setItem(field, 'yes');
});
$(window).on('unload', function () {
// If unload fires, and beforeunload hasn't set the field,
// then beforeunload didn't fire and is therefore not
// supported (cough * iPad * cough)
if (! window.localStorage.getItem(field)) {
window.localStorage.setItem(field, 'no');
}
});
}
window.isBeforeunloadSupported = function () {
if (window.localStorage &&
window.localStorage.getItem &&
window.localStorage.getItem(field) &&
window.localStorage.getItem(field) == "yes" ) {
return true;
} else {
return false;
}
}
})(jQuery);
Вот полное jsfiddle с примером использования.
Обратите внимание, что он будет обнаружен только при второй или последующих загрузках страницы на вашем сайте. Если вам важно, чтобы он работал и на самой первой странице, вы можете загрузить iframe
на этой странице с атрибутом src
, указывающим на страницу в том же домене с обнаружением, убедитесь, что он загрузить и затем удалить его. Это должно гарантировать, что обнаружение было сделано, чтобы isBeforeunloadSupported()
работал даже на первой странице. Но мне это не нужно, поэтому я не включил это в свою демонстрацию.