背景选项卡上运行帆布(Run canvas on background tab)

2019-09-18 07:37发布

我最近创建了(也使用Processing.js)一个HTML5画布动画。

问题是,当我切换浏览器不同的选项卡动画停止播放。

我怎样才能让动画继续播放,而用户是不同的标签比含动画的一个吗?

例如: http://jsfiddle.net/EyFTr/3/

如果切换选项卡上的时钟停止,但如果你打开链接的新窗口和模糊窗口中的时钟也将移动。

Answer 1:

简短的回答是你不能。

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用于动画)

那里有几个方法来“解决”这一点。 他们包括检查时间,并计算该对象“应该”基于时间,一旦标签被激活。 在您的例子,虽然但它看起来像你的代码将做到这一点,因为它是基于反正时间的时钟。



Answer 2:

作为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和超时被内部设置,这可能不是任何使用你的。



Answer 3:

见的setInterval无法在Chrome正常工作 。 基本上围绕浏览器会惹的setInterval转到后台运行,以提高性能的时候,所以你不能准确控制会发生什么。



文章来源: Run canvas on background tab