6

我有一个每秒倒计时的计时器。在用户打开我的网站的 3 或 4 个标签之前,它的效果很好,此时最新标签的计时器会以两倍或三倍的速度运行。我目前只能重现 IE8 中的错误。我以前使用 setInterval,也可以在 Firefox 中重现该错误。

我实际上使用的是 FBJS(Facebook 的 Javascript),所以我只给出一些伪代码。

function countDown() {
  ...
  setTimeout(function() { countDown() }, 1000);    
}

countDown();

然而,我真正在寻找的是更多的理论。我知道浏览器可以尝试使用 setInterval 来“追赶”,但是多个选项卡如何导致 setTimeout 出现这种行为?

4

1 回答 1

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 ?>();

如果这改变了观察到的行为,那就证明了我的想法。(并且可能提供解决问题的方法。)

于 2009-07-21T05:33:46.720 回答