我有一个 setInterval
运行一段代码 30 次。这很好用,但是当我选择另一个选项卡时(这样带有我的代码的选项卡变为非活动状态), setInterval
由于某种原因被设置为空闲状态。
我制作了这个简化的测试用例( http://jsfiddle.net/7f6DX/3/ ):
var $div = $('div');
var a = 0;
setInterval(function() {
a++;
$div.css("left", a)
}, 1000 / 30);
如果您运行此代码然后切换到另一个选项卡,请等待几秒钟然后返回,动画会在您切换到另一个选项卡时的位置继续。
因此,如果选项卡处于非活动状态,动画不会每秒运行 30 次。这可以通过计算每秒调用 setInterval
函数的次数来确认 - 如果选项卡处于非活动状态,这将不是 30 次,而是 1 或 2 次。
我猜想这是为了提高系统性能而设计的,但是有什么办法可以禁用这种行为吗?
在我的场景中,这实际上是一个缺点。
原文由 pimvdb 发布,翻译遵循 CC BY-SA 4.0 许可协议
在大多数浏览器上,非活动选项卡的执行优先级较低,这会影响 JavaScript 计时器。
如果过渡的值是使用 帧之间经过的实时时间 而不是每个间隔的固定增量计算的,则您不仅可以解决此问题,还可以通过使用 requestAnimationFrame 实现窒息动画,因为如果处理器不是,它可以达到 60fps很忙。
这是使用
requestAnimationFrame
的动画属性转换的普通 JavaScript 示例:对于后台任务(非 UI 相关)
@UpTheCreek 评论:
如果您有 需要 在给定时间间隔精确执行的后台任务,您可以使用 HTML5 Web Workers 。请查看 下面 Möhre 的回答 以了解更多详细信息……
CSS 与 JS“动画”
这个问题和 许多其他 问题可以通过使用 CSS 转换/动画而不是基于 JavaScript 的动画来避免,这会增加相当大的开销。我推荐这个 jQuery 插件,它让您可以像
animate()
方法一样从 CSS 转换中获益。