更改标签时,Javascript会在iPad上暂停:有没有办法知道什么时候回来?

更改标签时,Javascript会在iPad上暂停:有没有办法知道什么时候回来?,javascript,ipad,safari,dom-events,Javascript,Ipad,Safari,Dom Events,我在线程中描述了相同的问题 我的问题是,当我回到暂停的选项卡时,是否能被注意到 onfocus和onblur事件不适用于待暂停选项卡 守则: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="http://code.jquery.com/jquery-1.7.1.min.js" ></script> <script type="text/javascript"&g

我在线程中描述了相同的问题

我的问题是,当我回到暂停的选项卡时,是否能被注意到

onfocus
onblur
事件不适用于待暂停选项卡

守则:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>
<script src="http://code.jquery.com/jquery-1.7.1.min.js" ></script>
<script type="text/javascript">
window.onblur = function () {
    console.log("blur");
    $("#whatevent").append("blur<br/>");
}
window.onfocus = function () {
    console.log("focus");
    $("#whatevent").append("focus<br/>");
 }
 window.onunload = function () {
       console.log("unload");
       $("#whatevent").append("unload<br/>");
 }
 window.onload = function () {
      console.log("load");
      $("#whatevent").append("load<br/>");
  }

</script>
</head>

<body>
    <div id="whatevent"></div>
</body>
</html>

window.onblur=函数(){
控制台日志(“模糊”);
$(“#whatevent”)。追加(“blur
”; } window.onfocus=函数(){ 控制台日志(“焦点”); $(“#whatevent”)。追加(“焦点
”; } window.onunload=函数(){ 控制台日志(“卸载”); $(“#whatevent”)。追加(“卸载
”; } window.onload=函数(){ 控制台日志(“加载”); $(“#whatevent”)。追加(“加载
”; }

只有
onload
(但只有我第一次加载页面时)当我切换标签时,事件才能在iPad上运行。

两年前有人向我提出了这个问题。不幸的是,只有几个答案,其中一个似乎是实现这一效果的唯一方法。在苹果能够在mobile safari中实现完整页面可见性API之前,我只能使用我创建的自定义对象,该对象将使用该API,如果不可用,则返回心跳滴答器。然而,据我所知,没有很好的方法来检查即将发生的制表符切换

演示其唯一真实方法的对象。它本质上只接受焦点事件的处理函数,该事件在浏览器返回源选项卡时触发。回退充其量是黑客攻击,不仅在页面重新进入时,而且在脚本停止时间超过计时器阈值时触发;这可能是在键盘可见、滚动或正在运行的脚本阻止requestAnimationFrame触发时发生的。由于滚动是最常见的行为,我添加了一个处理程序,用于重置上次保存的时间,以便焦点事件不会触发

这是脚本的主要部分,包括如上所述的“hacky”方法:

    _that.onFocus = function(handler, params) {
        var hiddenProp = getHiddenProp();

        console.log("Hidden prop: " + hiddenProp);

        if (hiddenProp) {
            var evtName = hiddenProp.replace(/[H|h]idden/, "") + "visibilitychange";
            document.addEventListener(evtName, function(e) {
                if (isHidden()) {
                    handler(e, params);
                }
            }, false);
        }else {
            var handlerObj = {"handler": handler};
            if (params !== undefined) {handlerObj.params = params}
            _handlers.push(handlerObj);
            startLoop();
        }

    };
其余的可以用小提琴来读。为了查看后备功能,您必须使用平板电脑(否则,没有平板电脑,您为什么需要此功能?)

请注意,.onFocus方法可能会为其第二个参数接受一个参数数组,然后将该数组传递给事件处理程序。这意味着您的事件处理程序将始终为其第一个参数(如果不支持API,则为null)提供一个事件对象,并将您的参数数组作为其第二个参数


另外,这段代码已经测试了几个小时,所以可能会出现故障。在Mobile Safari投入使用之前,我将非常感谢任何建设性的批评,以使其具有生产价值。

如果您只是想让代码正常工作,您可以将其发布在此处,并可能会找到答案,如链接问题中所示。