Есть ли способ использовать window.onbeforeunload для Mobile Safari для устройств iOS?
Похоже, Apple отключила событие window.onbeforeunload для устройств iOS (iPhone, iPad, iPod Touch). К сожалению, я не могу найти никакой документации относительно того, почему это событие не работает в Mobile Safari.
Кто-нибудь знает, есть ли надежная альтернатива этой функции? Браузер Android, похоже, поддерживает его очень хорошо, и настольное приложение Safari также поддерживает событие onbeforeunload без проблем.
Ответы
Ответ 1
Я вижу, что это старый вопрос, но я столкнулся с этой проблемой в последнее время.
Я использую window.unload
, и он отлично работает в браузерах ios (хотя, если вы посмотрите на документацию Apple, это кажется устаревшим и они рекомендуют использовать document.pagehide
)
Ответ 2
Если вам это действительно нужно, вы можете просто получить все ссылки, формы и объекты DOM, которые имеют обработчик, изменяющий URL-адрес, и заставляют их ждать, пока вы не сделаете то, что хотите.
Для ссылок вы получите их через getElementsByTagName, проверьте, начинается ли href с чего-либо, кроме #, и просто добавьте функцию onbeforeunload add onclick (которая будет вызвана до того, как будет рассмотрен href).
То же самое для форм, но с onsubmit.
И наконец, для элементов, изменяющих href с JavaScript, вы должны убедиться, что когда вы добавляете lsitener, который вы называете своей функцией onbeforeunlaod (или, если вы используете слушатели DOM0 или DOM1, вы можете просто добавить некоторый класс, а затем использовать глобальный script, который проверяет все элементы класса и добавляет его в прослушиватель событий с закрытием.
Но вы должны нормально избегать использования этого события (возможно, используя файлы cookie для хранения вещи, которую вы хотели отправить каждые x секунд, и позволяя в худшем случае взглянуть на нее в следующий раз, когда пользователь загрузит страницу и, в лучшем случае, иметь возможность отправлять запрос Ajax в onbeforeunload или onunload, который, даже если он отправляет только заголовки http, woudl позволяет вам получить то, что вы хотите).
Ответ 3
Эта статья содержит некоторую интересную информацию о pagehide
, beforeunload
и unload
.
В общем, вы не должны полагаться на них на мобильных устройствах вообще, потому что они, вероятно, не будут срабатывать в различных ситуациях. Вместо этого используйте событие visibilitychange
:
// query current page visibility state: prerender, visible, hidden
var pageVisibility = document.visibilityState;
// subscribe to visibility change events
document.addEventListener('visibilitychange', function() {
// fires when user switches tabs, apps, goes to homescreen, etc.
if (document.visibilityState == 'hidden') { ... }
// fires when app transitions from prerender, user returns to the app / tab.
if (document.visibilityState == 'visible') { ... }
});