窗口不在焦点时的window.setTimeout行为

 仁寿戴氏 发布于 2023-02-09 11:27

这是我能想到的最简单的复制代码:

ms = 30; // 1000 ?
num = 1;
function test()
{
    num+=ms;
    document.getElementById('Submit').value = num; // Using native Javascript on purpose
    if (num < 4000)
        window.setTimeout(test, ms);
}
test()

我将ms(迭代之间的毫秒数)设置为30,运行脚本并移动到浏览器上的不同选项卡.

然后我等待大约10秒钟(脚本应该在4秒内完成)然后回到选项卡.

如果我使用Firefox,我看到脚本还没有完成,数字仍然在运行(从我离开它们的地方恢复,我猜).

这很烦人,

但如果我改为ms1000并重复上述步骤,当我回到标签时,我看到脚本确实已经完成了.

(该脚本仍需要4秒钟才能完成).

也就是说,即使窗口没有焦点,有时Firefox也会运行window.setTimeout,有时它不会.可能取决于持续时间

另一方面,Internet Explorer不会发生这种情况.

即使选项卡没有聚焦,它也会继续运行脚本.无论我怎么设置ms.

这是由于Firefox的某些性能考虑因素吗?

究竟发生了什么?

现在,如何在浏览器之间保持一致的基本功能?

或者,我工作错了吗?编码是一种奇怪的方式吗?

我只是尝试以延迟的方式反复更改DOM,而不使用setInterval(因为我正在改变它自己的间隔).

最重要的是,我该如何看待这个?

我不能假设我的用户不会离开标签.

我想让我的用户离开页面,就像人们想要的那样.

如果一个人离开并在半小时后回来,他/她将在页面上看到不相关的动画,仍在运行.

连接到该页面的所有用户都可以看到其中一些动画.

它们不需要以毫秒的分辨率同步,但只有当用户将选项卡/窗口置于焦点时才能启动它们.

我正在使用Firefox 25.0.1和IE 11.(Windows 7)

1 个回答
  • 大多数现代浏览器(特别是在移动设备上)暂停执行脚本,这些脚本在焦点之外,以节省CPU周期(例如,这就是为什么requestAnimationFrame生效).在超时的情况下,较短的间隔实际上会在浏览器供应商认为合适时更改为不同/更高的值.

    你可以做些什么来克服这个问题(如果你真的必须知道连续执行之间的间隔)是在激活超时时设置一个时间戳,并将它与实际执行超时处理程序时的时间戳进行比较.请注意,当您设置动画时,最好通过考虑其他应用程序变量来计算动画对象的属性,而不是依赖于特定处理程序所具有的调用量.

    您还可以将监听器附加到窗口以"(非)聚焦"事件,以了解用户何时"返回"您的应用程序.在此事件处理程序中,您可以验证超时是否处于挂起状态并手动执行其回调(如果必须这样做).

    2023-02-09 11:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有