Chrome上的JavaScript clearTimeout问题

时间:2010-09-30 13:08:06

标签: javascript google-chrome

我的页面上有一个计时器,间隔为10秒。它是使用setTimeout(“myWork()”,10000)创建的。它完美地运作。在某些基于某些条件的时间点,我清除此间隔并创建一个必须以1s间隔打勾的新间隔。

var tenSecTimer = 0;

if (myCondition)
{
  clearTimeout(tenSecTimer);
  tenSecTimer = setTimeout("myWork()", 1000);
}

整个过程适用于所有版本的IE和FireFox。当我在Chrome(6.0)中打开此页面时,在调用clearTimeout后,自动收报机停止工作。它永远不会识别1s计时器。

我最近缺少什么铬?

由于

5 个答案:

答案 0 :(得分:1)

为什么不使用它?

var tenSecTimer = 0;

if (myCondition) {
    clearTimeout(tenSecTimer);
    tenSecTimer = setTimeout(function () {
        myWork();
    }, 1000);
}

注意:它传入一个函数,然后执行myWork函数。使用setTimeout或setInterval的字符串是不好的,因为它然后调用eval(这很慢,并且有其他问题)。

Source (scroll all the way to the bottom)

答案 1 :(得分:0)

我怀疑这会解决它但是你试过传递引用而不是要评估的字符串吗?

setTimeout( myWork, 1000)

答案 2 :(得分:0)

我不确定您的其余代码是什么样的,但最好不要使用setInterval()代替setTimeout()。签名模式是相同的,但setInterval会自动处理重复。

答案 3 :(得分:0)

不是答案,而是表现出相同行为的完整代码:

(function () {
var counter = 0;

function testCounter() {
  if (counter === 2) {
    clearInterval (timer);
    timer = setInterval (myWork, 1000);
  } 

  else if (counter === 5)
    clearInterval (timer);
}

function myWork () {
  document.body.innerHTML += ++counter + ' ' + Date () +'<br/>';
}

document.body.innerHTML += 'Starting ' + Date () +'<br/>';
var timer = setInterval (myWork, 10000);
setInterval (testCounter, 500);
}) ();

此代码显示:

Starting Thu Sep 30 2010 16:15:09 GMT+0200 (CEST)
1 Thu Sep 30 2010 16:15:19 GMT+0200 (CEST)
2 Thu Sep 30 2010 16:15:29 GMT+0200 (CEST)

并且没有了,如果我删除testCounter上的setInterval并在myWork中调用它,我得到以下内容:

Starting Thu Sep 30 2010 16:20:50 GMT+0200 (CEST)
1 Thu Sep 30 2010 16:21:00 GMT+0200 (CEST)
2 Thu Sep 30 2010 16:21:10 GMT+0200 (CEST)
3 Thu Sep 30 2010 16:21:11 GMT+0200 (CEST)
4 Thu Sep 30 2010 16:21:12 GMT+0200 (CEST)
5 Thu Sep 30 2010 16:21:13 GMT+0200 (CEST)

非常好奇......

答案 4 :(得分:0)

我想我已经解开了问题的奥秘。从韩的评论中得到提示,我意识到实际代码在做什么。我有一个1s时钟计时器,它产生清除10s计时器的条件,然后为“myWork”启动1s计时器。在回拨1s定时器被召唤之前,又发生了另一个时钟节拍。现在清除了等待“myWork”被调用的计时器。所以它几乎陷入了永无止境的循环。似乎Chrome的计时器变得太有效了:-)解决这个问题的关键是我将“myWork”的计时器设置为小于1秒,或者有一个状态机来确保计时器在它之前没有被清除已被执行。