我有一个计时器,每秒倒计时。它工作得很好,直到用户打开我站点的3或4个选项卡,此时最新选项卡的计时器变为双倍或三倍速度。我目前只能重现IE8中的错误。我之前使用过setInterval,也可以重现Firefox中的错误。
我实际上正在使用FBJS(Facebook的Javascript),所以我只是给出一些伪代码。
function countDown() {
...
setTimeout(function() { countDown() }, 1000);
}
countDown();
然而,我真正想要的是更理论化的。我知道浏览器可以尝试使用setInterval来“追赶”,但是多个标签如何导致setTimeout的这种行为?
答案 0 :(得分:5)
整个情况非常奇怪。唯一可以理解的情况是,浏览器试图“平滑”自恢复setTimeouts的时间段,与setInterval相同,并且正在执行的代码实际上将定时器混淆在不同的窗口中其他
我不知道它是否可行,特别是涉及到Facebook,但一个有趣的测试是给每个实例一个countDown
函数的随机名称,看看是否有任何区别,如:
<?php $timerTag = rand(1, 1000); ?>
function countDown<?php echo $timerTag ?>() {
...
setTimeout(function() { countDown<? php echo $timerTag ?>() }, 1000);
}
countDown<?php echo $timerTag ?>();
如果这改变了观察到的行为,那就是我想到的场景。 (并且可能提供解决问题的方法。)