在iPad上运行时,Mobile Safari中即将进行的选项卡切换的Pagehide事件不会触发

时间:2012-08-03 12:35:36

标签: ios javascript-events mobile-safari

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

  1. 切换到其他浏览器标签
  2. 切换到其他iOS应用(例如,当您接到来电的电话应用时)
  3. 您可以订阅该窗口的“pagehide”“pageshow”事件,以检测即将暂停和重新激活Javascript。

    问题是,在 iPad 移动版Safari上标签切换(1.)时,这些事件不会触发。在 iPhone 移动版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浏览器上检测到即将发生的标签切换?

    this discussion of the same topic中描述的心跳循环可以检测到再次激活标签时Javascript的重新激活

3 个答案:

答案 0 :(得分:1)

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

为什么需要Page Visibility API?

  1. 您可以使用存储事件来说出其他活跃的网页。
  2. 您可以使用计时器(setInterval)来检查上次计时器触发的时间。如果它比预期的更大 - 页面被隐藏,因为大多数浏览器停止计时器,然后页面被隐藏。

答案 1 :(得分:1)

Apple在 iOS7 中修正。 (刚试过iPad模拟器)

答案 2 :(得分:0)

我同意Pinal:使用焦点/模糊!但我建议不要在文件上,而是在窗口上。 只需注册一个监听器并在那里做你的东西。

http://caniuse.com/#feat=pagevisibility所述,您要使用的功能未得到很好的实施。 (编辑:刚刚在一个迷你测试用例中测试过 - 它可以在iOS 5/6上运行 - 尽管caniuse.com断言不同)

如果您尝试使用计时器,可以尝试使用requestAnimationFrame替代setInterval。