我最近创建了(也使用Processing.js)一个HTML5画布动画。
问题是,当我切换浏览器不同的选项卡动画停止播放。
我怎样才能让动画继续播放,而用户是不同的标签比含动画的一个吗?
例如: http://jsfiddle.net/EyFTr/3/
如果切换选项卡上的时钟停止,但如果你打开链接的新窗口和模糊窗口中的时钟也将移动。
我最近创建了(也使用Processing.js)一个HTML5画布动画。
问题是,当我切换浏览器不同的选项卡动画停止播放。
我怎样才能让动画继续播放,而用户是不同的标签比含动画的一个吗?
例如: http://jsfiddle.net/EyFTr/3/
如果切换选项卡上的时钟停止,但如果你打开链接的新窗口和模糊窗口中的时钟也将移动。
简短的回答是你不能。
https://developer.mozilla.org/en/DOM/window.setTimeout
在(火狐5.0 / 5.0雷鸟/ SeaMonkey的2.2)和铬11,超时被夹紧到击发频率不超过每秒一次(1000毫秒)的活动标签; 看到错误633421关于这在Mozilla或有关这个在Chrome细节的更多信息crbug.com/66078。
有关浏览器是在报价有点老,但它仍然具有现实意义。 这是由设计。 其以减少处理器负载时的标签是不活跃。 (Processing.js使用setTimeout
用于动画)
那里有几个方法来“解决”这一点。 他们包括检查时间,并计算该对象“应该”基于时间,一旦标签被激活。 在您的例子,虽然但它看起来像你的代码将做到这一点,因为它是基于反正时间的时钟。
作为Loktar建议,这种症状可以通过检查时间,搞清楚你应该得到缓解。 下面是可以做到这样的功能:
function smartInterval(func, interval){
var last = new Date() - interval,
now,
numMissed;
(function iterate(){
func();
// compute the number of iterations you might have missed
// if you tabbed away and the interval was restricted to 1000ms
now = +new Date();
numMissed = Math.round((now - last) / interval) - 1;
// make up for those iterations that were lost
while (numMissed--) { func(); }
last = +new Date();
setTimeout(iterate, interval);
})();
}
用法:
smartInterval(function(){console.log('hi');}, 100);
下面是一个例子的的jsfiddle。 试评出来的while
循环( while (numMissed--)
看到,通过切换到一个标签,你会得到更少的数字。 随着while
循环出现,但是,它看起来好像间隔从未改变。
不幸的是,因为你正在使用Processing.js和超时被内部设置,这可能不是任何使用你的。
见的setInterval无法在Chrome正常工作 。 基本上围绕浏览器会惹的setInterval转到后台运行,以提高性能的时候,所以你不能准确控制会发生什么。