您正在运行一个setInterval
或一系列setTimeout
s。
每一个都排队等待在您在函数中指定的点之后运行。
谷歌将你页面上的所有内容限制为每秒更新几次......所以如果你设置了定时器来移动东西并以 30fps 或其他速度进行动画处理,那么你就会让谷歌启动一轮更新(无论您安排了什么),这无疑会调用请求另一个更新的东西,这将请求另一个更新......
...当您切换回来时,您有数百个(或数万个)这些更新等待发生,现在不是以 30fps 发生,而是有一堆这样的事情在等待...所有这些更新都已经过去了他们的“直到...”时间才运行,并且他们都将尝试尽可能快地更新,直到您再次赶上计时器的当前位置。
如果浏览器支持页面可见性 API 的组件,则在页面不可见时暂停调用。
if (!document.hidden) { doStuff(); }
或者
document.addEventListener("visibilitychange", function (evt) {
if (evt.visibilityState === "hidden") { myApp.pause(); }
else if (evt.visibilityState === "visible") { myApp.resume(); }
});
如果它不支持 API,那么您可以尝试使用 polyfillwindow.onblur
或其他方式填充它。
也就是说,如果浏览器不支持页面可见性 API,它也不会对页面代码进行硬核限制。
这不是 100% 的保证,而是半可能性。