setTimeout没有停止

时间:2010-04-29 10:27:14

标签: javascript ajax

我正在建立一个测验,如果他在答案为3的时间内没有回应,那么用户有5秒的时间来回答问题(这是一个无答案的代码)。定时器更新就好了,直到你从这一点回答一个问题,计时器失控,你看到5,3,4,0并转到下一个问题,答案3有人知道如何杀死旧计时器吗?

  function tijd(aantalSec){
    document.getElementById("sec").innerHTML = aantalSec;

    if(aantalSec == 0){
        clearTimeout(tijd);
        antwoord(3);
    }else{
        aantalSec = aantalSec - 1;
        var tijd = setTimeout('tijd(' + aantalSec + ',0)',1000);
    }
    }

4 个答案:

答案 0 :(得分:2)

这是一个范围问题。把tijid作为一个全局变量。还要将变量重命名为另一个名称,因为它与函数名称混淆。

var intrID;

function tijd(aantalSec)
{       
   document.getElementById("sec").innerHTML = aantalSec;

   if(aantalSec == 0)
   {
       clearTimeout(intrID);
       antwoord(3);
   }
   else
   {
       aantalSec = aantalSec - 1;
       intrID = setTimeout('tijd(' + aantalSec + ',0)',1000);
   }
}

答案 1 :(得分:1)

您应该尝试声明var tijd外部函数,并将timerID更改为rahul提到的其他内容。

答案 2 :(得分:1)

在函数外声明tijd使其成为全局的。此外,重命名它,让变量的名称与函数名称相同是令人困惑的。

答案 3 :(得分:1)

这是像rahul所说的范围问题,但更好的解决方案是使用静态变量。您可以在javascript中轻松完成此操作,因为函数是对象。所以:

function tijd(aantalSec){

    document.getElementById("sec").innerHTML = aantalSec;

    if(aantalSec == 0){
        clearTimeout(tijd.timer);
        antwoord(3);
    }else{
        aantalSec = aantalSec - 1;
        tijd.timer = setTimeout('tijd(' + aantalSec + ',0)',1000);
    }
    }

重要的一点是我已经将你的变量从var tijd改为tijd.timer,这在调用函数之间变得持久。

全球是邪恶的。