【发布时间】:2012-07-13 05:03:54
【问题描述】:
一般来说,浏览器似乎会在某些情况下修改setInterval 使用的实际时间间隔,甚至超出最小限制。例如,我有以下代码:
function start() {
window.setInterval(function() {
update();
}, 1);
}
lastTime = new Date;
numFrames = 0;
lastFrames = 0;
function update() {
numFrames++;
if (new Date - lastTime >= 1000) {
lastFrames = numFrames;
numFrames = 0;
lastTime = new Date;
}
}
在这里,lastFrames 将为我们提供大约过去一秒的帧数。在 Chrome、Firefox 和 Safari 中使用时,此代码不会在一毫秒内运行。当然,每个浏览器在setInterval 调用之间有一个任意的最小时间,所以这是可以预料的。但是,随着页面继续运行,帧速率将继续降低,即使选项卡仍处于焦点状态。我发现解决这个问题的唯一方法是让浏览器做一些事情。这些方面的东西似乎使浏览器尽可能快地运行setInterval:
function start() {
window.setInterval(function() {
update();
}, 1);
}
lastTime = new Date;
numFrames = 0;
lastFrames = 0;
function update() {
numFrames++;
if (new Date - lastTime >= 1000) {
lastFrames = numFrames;
numFrames = 0;
lastTime = new Date;
}
//doIntensiveLoop, processing, etc.
}
因此,我的问题是:浏览器在寻找什么来证明运行 setInterval 更接近我的要求?
编辑:HTML5 规范规定浏览器不应允许 setInterval 以低于 4 毫秒的间隔运行。
【问题讨论】:
-
每个 HTML5 规范的最小间隔/超时延迟值为 4 毫秒。低于此值的任何内容都将自动重新计算为 4 毫秒。浏览器实现可能会有所不同,因此您不应依赖小于 4 毫秒的时间间隔。这样做也不谨慎。
-
此外,没有焦点的窗口/选项卡可能会被阻塞到更大的最小间隔时间(例如,1 秒)。
-
@Pointy +1 绝对正确,Firefox 和 Chrome 会将非活动选项卡/窗口的超时/间隔限制为最大 1/秒。
-
我不确定它到底是什么,感谢您提供的信息。但正如我上面所说,这不是问题所在。
-
抱歉,我找不到任何其他方式来回答您的问题。如果您的浏览器以某种方式执行间隔快于每 4 毫秒,那么它要么不符合 HTML5,要么具有与其他主要浏览器不兼容的独立实现。现在,如果您想要一种可靠的方法来跟踪用户在您的页面上停留了多长时间,那么问题就略有不同了。