Подтвердить что ты не робот

Есть ли способ использовать window.onbeforeunload для Mobile Safari для устройств iOS?

Похоже, Apple отключила событие window.onbeforeunload для устройств iOS (iPhone, iPad, iPod Touch). К сожалению, я не могу найти никакой документации относительно того, почему это событие не работает в Mobile Safari.

Кто-нибудь знает, есть ли надежная альтернатива этой функции? Браузер Android, похоже, поддерживает его очень хорошо, и настольное приложение Safari также поддерживает событие onbeforeunload без проблем.

4b9b3361

Ответ 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') { ... }
});