13

众所周知,Mobile Safari 在网页上暂停 Javascript 执行时

  1. 你切换到不同的浏览器标签
  2. 切换到不同的 iOS 应用程序(例如,当您接到电话应用程序时)

您可以订阅窗口的“pagehide”“pageshow”事件来检测即将暂停和重新激活 Javascript。

问题是,在iPad Mobile Safari上切换选项卡(1.)时不会触发这些事件。在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>

它仅在执行应用程序切换 (2.) 而不是选项卡切换 (1.) 时才会在 iPad(iOS5 和 iOS6 Preview3)上触发。所有的 iPhone 都可以正常工作。。

有没有人能够检测到 iPad 浏览器上即将发生的标签切换?

对同一主题的讨论中所述,可以通过心跳循环再次检测JavaScript重新激活JavaScript 。

4

4 回答 4

1

由 Apple 在iOS7中修复。(刚刚在 iPad 模拟器中尝试过)

于 2013-12-16T11:24:00.407 回答
1

我同意皮纳尔:使用焦点/模糊!但我建议不要在文件上,而是在窗口上。只需为他们注册一个听众并在那里做你的事情。

正如http://caniuse.com/#feat=pagevisibility所说,您要使用的功能没有很好地实现。(编辑:刚刚在一个迷你测试用例中对其进行了测试——它适用于 iOS 5/6——即使 caniuse.com 断言不同)

如果您尝试使用计时器,您可以尝试 requestAnimationFrame 作为 setInterval 的替代方法。

于 2013-07-16T07:16:57.293 回答
1

尝试检查文档的焦点和模糊。

为什么需要页面可见性 API?

  1. 您可以使用存储事件来说明其他页面,谁是活动的。
  2. 您可以使用计时器 (setInterval) 检查上次计时器触发的时间。如果它比预期的大 - 页面被隐藏,因为大多数浏览器停止计时器然后页面被隐藏。
于 2013-07-01T11:47:15.540 回答
0

根据塞巴斯蒂安的回答,这些天(与 2013 年到 2021 年相比)页面可见性工作得相当好:有关更多信息,请参阅https://www.w3.org/TR/page-visibility/#example-1-visibility-aware-video-playback围绕订阅隐藏/可见状态的“visibilitychange”。

如今,这似乎比焦点/模糊更有用,因为它涵盖了可见但未选择的窗口,如果还关注多窗口操作系统。

于 2021-09-29T19:17:33.277 回答