window.onbeforeunload не работает на iPad?
Кто-нибудь знает, если onbeforeunload
событие поддерживается на iPad и / или есть ли другой способ его использования?
Я попробовал почти все, и кажется, что onbeforeunload
событие никогда не запускается на iPad (браузер Safari).
Именно это я и пробовал:
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
window.onbeforeunload = function(event) { return 'test'; }
- (оба вышеперечисленных вместе)
window.onbeforeunload = function(event) { alert('test')'; }
- (все вышеперечисленные функции, но внутри
<body onbeforeunload="...">
Все это работает на FF и Safari на ПК, но не на iPad.
Кроме того, я сделал следующее сразу после загрузки страницы:
alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);
Соответственно, результаты таковы:
true
object
null
Итак, браузер имеет свойство, но по какой-то причине оно не срабатывает.
Я пытаюсь отойти от страницы, нажимая кнопки "назад" и "вперед", выполняя поиск Google в верхней панели, меняя местоположение в адресной строке и нажимая на закладку.
Кто-нибудь имеет представление о том, что происходит? Я был бы очень признателен за любой вклад.
Спасибо
8 ответов
Этот фрагмент JavaScript работает для меня в Safari и Chrome на ipad и iphone, а также в настольных / портативных / других браузерах:
var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";
window.addEventListener(eventName, function (event) {
window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
...
} );
Я обнаружил, что событие onunload () срабатывает. Это поведение несколько странно; все, что у вас есть в функции обратного вызова, прикрепленной к событию, на самом деле запускается после загрузки новой страницы в фоновом режиме (вы не можете сказать, что она загружена, но регистрация на сервере покажет, что она есть).
Как ни странно, если в onunload () у вас есть вызов verify (), и пользователь щелкнул ссылку, чтобы перейти куда-то еще, вы работаете. Однако если пользователь закроет вкладку браузера iPad Safari, сработает событие onunload (), но в качестве ответа вы подтвердите () с подтверждением ().
Только компания Apple будет знать наверняка, но мне кажется, что они намеренно не включили эту функцию в мобильном Safari, так как он чаще всего используется тенистыми символов, чтобы заставить вас остаться на своем сайте или выскочит много порно / рекламных окон.
Событие beforeunload не поддерживается Mobile Safari. Вы можете увидеть список всех поддерживаемых событий здесь: Обработка событий Документация Apple
И до загрузки нет в списке!
В WebKit есть известная ошибка с onbeforeunload. Я считаю, что это исправлено в последней бета-версии Chrome 5, но вполне возможно, что браузер iPad сделан из версии WebKit, которая не имеет исправления.
Вот решение, которое должно работать во всех современных браузерах:
var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
if (unloaded)
return;
unloaded = true;
console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
if (document.visibilityState == 'hidden')
{
if (unloaded)
return;
unloaded = true;
console.log("beforeUnload");
}
});
Мобильные браузеры не поддерживают beforeunload
поскольку браузер может перейти в фоновый режим, не выгружая страницу, он может быть убит операционной системой в любое время.
Большинство настольных браузеров содержат ошибку, которая вызывает visibilityState
не вызывать при выгрузке документа. Смотрите: здесь.
Поэтому важно включить оба события, чтобы охватить все сценарии.
NB
я использовал console.log
вместо alert
в моем примере, потому что alert
будет заблокирован некоторыми браузерами при вызове из beforeunload
или же visibilitychange
,
https://code.google.com/p/chromium/issues/detail?id=97035
видеть, слышать.
оповещения больше не разрешаются во время событий закрытия страницы (до загрузки, выгрузки, скрытия страницы).
Я думаю, что предупреждения, подсказки, подтверждения и другие подобные действия также больше не разрешены.
Если вам просто нужно знать, была ли страница оставлена, вы можете использовать document.unload
, Он отлично работает в браузерах IOS. Если вы увидите документацию Apple, вы обнаружите, что она устарела, и они рекомендуют использовать document.pagehide