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, которая не имеет исправления.

Связанный отчет об ошибке Chrome.

Вот решение, которое должно работать во всех современных браузерах:

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

Другие вопросы по тегам