我的Javascript计时器倒数太快,或者在加载时无法启动

我的Javascript计时器倒数太快,或者在加载时无法启动,javascript,timer,onload,Javascript,Timer,Onload,我有一个Javascript计数器: var x=100; function timerCountdown() { document.getElementById('timer1').value=x; x--; t=setTimeout("timerCountdown()",1000); if (x<-1) { document.getElementById('timer1').value='Done!'; clea

我有一个Javascript计数器:

var x=100;
function timerCountdown()
{
    document.getElementById('timer1').value=x;
    x--;
    t=setTimeout("timerCountdown()",1000);

    if (x<-1)
    {
        document.getElementById('timer1').value='Done!';
        clearTimeout(t);
    }   
}

function stopCounter(){
clearTimeout(t);
x=x+1;
}
然后我使用:

<body onFocus='timerCountdown()' onBlur='stopCounter()'>
但问题是,页面加载时倒计时不会开始。它等待我点击另一个窗口并再次聚焦该窗口

所以我试了一下:

<body onLoad='timerCountdown()' onFocus='timerCountdown()' onBlur='stopCounter()'>
但这一次,倒计时进行得相当快。可能是因为timerCOuntdown每秒调用两次

或者,我可以在body标签中使用onFocus和onBlur,但我需要一个函数来触发身体负荷时的焦点。可能吗

有人有解决这个问题的建议吗


非常感谢

简单的答案是因为setTimeout被调用两次,分别运行timerCountdown一次两次,并持续设置两个setTimeout ID

这就是你想要的:

var x = 100;
var t = 0;

function timerCountdown()
{
    if (t == 0) t = setInterval(timerCountdown, 1000);

    document.getElementById('timer1').value=x;
    x--;

    if (x < 0) 
    {
        document.getElementById('timer1').value='Done!';
        clearTimeout(t);
        ticker = 0;
    }
}

function stopCounter()
{
    clearTimeout(t);
    t = 0;
    x++;
}

那么...怎么样如果加载了Focus='timerCountdown',为什么会有它呢?我不知道它到底在做什么,c-应该会抛出错误。嗨,因为我想在重新关注计时器页面后,计时器恢复。糟糕,它是x而不是c。刚刚更正了,非常感谢你的回复。它起作用了,但奇怪的事情发生了:在头两秒钟,倒计时的速度是原来的两倍。我在一秒钟内从100到98。不太清楚为什么会这样。你知道它为什么这么做吗?谢谢lot@eric01这可能是浏览器对事件的处理。使用您现有的代码,这个问题发生在Firefox上,而不是Chrome上。尝试我在上面编辑的建议更改。请注意,这些计时器本质上是不可靠的,因此根据浏览器的操作,它可能会加速或减慢。非常感谢。我真的不明白为什么,但这已经奏效了。谢谢,regards@eric01不客气!如果对你有帮助的话,请做;
t = setInterval(timerCountdown, 1000);