2010-04-29 60 views
0

我正在構建一個測驗,如果在回答爲3(這是無回答的代碼)的時間內沒有回覆,用戶有5秒鐘的時間回答問題。定時器更新很好,直到你從這一點回答一個問題,定時器失控5,3,4,0,然後回答下一個問題3有人知道如何殺死舊定時器嗎?setTimout不停止

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); 
    } 
    } 

回答

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); 
    } 
} 
+0

。變量消除了一個醜陋的全球需要。看到我的答案。 – Stomped 2010-04-29 10:33:28

+0

非常感謝你解決了這個問題:-) – Ken 2010-04-29 10:38:03

1

你應該嘗試聲明var tijd外功能和更改的timerId別的東西像提到拉胡爾。

1

在函數之外聲明tijd使其成爲全局函數。另外,重命名它,將變量的名稱與函數的名稱相同,這是令人困惑的。

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成爲調用函數之間的持續性

全局是邪惡