这与以下几点有关:
El Capitan 版 Safari 9.1
Safari 10 塞拉利昂版
有谁知道当浏览器或选项卡失去焦点(主要是最小化)时,Safari 在 JavaScript 引擎中对 setTimeout() 做了什么?
我创建了一个简单的 JavaScript Web 应用程序,我在 Safari 中加载该应用程序,该应用程序调用 JavaScript setTimeout(),该应用程序传递另一个要在超时值后执行的函数。该函数将日期/时间打印到控制台,然后使用相同的超时值调用 setTimeout()。
如果 Safari 选项卡失去焦点或浏览器最小化,一段时间后,Safari 似乎会停止执行 setTimeout 以及要调用的后续函数,直到焦点返回为止,不会执行任何函数。就好像事件循环停止处理一样。
注意:没有函数调用丢失,它们只是暂停,并在浏览器重新获得焦点时重新启动。
我在 Firefox、Chrome 或 IE11 中没有注意到这一点。
提出这个问题的主要原因是,该问题主要是在我维护的 Web 应用程序中观察到的,该应用程序使用 CometD 与服务器进行通信。 CometD 库使用 setTimeout 每 30 秒向服务器执行一次请求。如果运行应用程序的浏览器最小化,CometD 似乎会停止与服务器通信,直到浏览器再次最大化。
你可能应该使用设置时间间隔相反,因为根据这个答案, setInterval
即使限制为每秒 1 次,仍然有效。
WindowOrWorkerGlobalScope mixin 的 setInterval() 方法
重复调用一个函数或执行一个代码片段,具有固定的
每次通话之间的时间延迟。返回一个间隔 ID。
语法 varIntervalID =scope.setInterval(func,delay[param1,
参数2,...]); var IntervalID =scope.setInterval(代码, 延迟);
参数
func每延迟毫秒执行一次的函数。
code可选语法允许您包含字符串而不是函数,
每延迟毫秒编译并执行一次。这个语法
不建议使用 eval() 的原因与使用 eval() 的原因相同
安全风险。
delay时间,以毫秒为单位(千分之一
第二),计时器应该在指定的执行之间延迟
函数或代码。如果该参数小于 10,则值为 10
用过的。请注意,实际延迟可能会更长;参见“原因
延误时间超过指定时间”
WindowOrWorkerGlobalScope.setTimeout() 为例。
参数1,...,参数N可选的附加参数传递给
一旦定时器到期,由 func 指定的函数。
非活动选项卡中的超时限制为 >=1000ms
从后台减少负载(以及相关的电池使用量)
选项卡,超时通常被限制为每次触发不超过一次
第二个(1000 毫秒)位于非活动选项卡中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)