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

Событие Pagehide на неизбежном переключении вкладок в Mobile Safari не срабатывает при работе на iPad

Хорошо известно, что Mobile Safari приостанавливает выполнение Javascript на веб-странице, когда

  • вы переключаетесь на другую вкладку браузера.
  • переключитесь на другое приложение iOS (например, когда вы получаете входящий звонок в телефонное приложение)

Вы можете подписаться на события "на странице" и "страницы", чтобы обнаружить неминуемую приостановку и реактивацию Javascript.

Проблема заключается в том, что эти события не срабатывают, когда переключение табуляции (1.) на мобильном Safari iPad. На iPhone Mobile Safari все отлично, как описано выше.

Это тривиально, чтобы продемонстрировать:

<!DOCTYPE html>
<html>
<head>
    <script>
        window.addEventListener("pagehide", function(evt){
            var logger = document.getElementById('log_id');
            logger.innerText = logger.innerText + " pagehide fired!";
        }, false);
    </script>
</head>
<body>
<div id="log_id"></div>
</body>
</html>

Он запускается на iPads (iOS5 и iOS6 Preview3) только при выполнении переключения приложений (2.), а не при переключении табуляции (1.). Все iPhone работают нормально.

Кто-нибудь мог обнаружить неизбежную вкладку в браузере iPad?

Повторная активация Javascript, когда вкладка снова активируется, может быть обнаружена в цикле сердечного ритма, как описано в в этом обсуждении по той же теме.

4b9b3361

Ответ 1

Попробуйте проверить фокус и размытие документа.

Почему вам нужен API видимости страницы?

  • Вы можете использовать событие хранилища, чтобы сказать другие страницы, кто активен.
  • Вы можете использовать таймеры (setInterval) для проверки времени от последнего таймера. И если его больше, чем ожидалось, страница была скрыта, потому что большинство браузеров останавливают таймер, тогда страница скрыта.

Ответ 2

Исправлено Apple в iOS7. (Просто попробовал в iPad Simulator)

Ответ 3

Я согласен с Pinal: используйте focus/blur! Но я предлагаю не по документу, а скорее по окну. Просто зарегистрируйте слушателя и сделайте свой материал там.

Как указано http://caniuse.com/#feat=pagevisibility, функция, которую вы хотите использовать, не очень хорошо реализована. (Edit: просто протестировали его в мини-тестовом корпусе - он работает на iOS 5/6 - хотя caniuse.com утверждает разные)

Если вы попытаетесь использовать таймер, вы можете попробовать requestAnimationFrame в качестве альтернативы setInterval.