Событие 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, когда вкладка снова активируется, может быть обнаружена в цикле сердечного ритма, как описано в в этом обсуждении по той же теме.
Ответы
Ответ 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.