2011-10-26 71 views
1

我有一個函數以不同的速度顯示單詞。該函數開始確定,但我似乎無法讓代碼正確地再次停止它。 我知道我必須使用clearInterval,我認爲這是爲了清除var myTimer - 但我無法得到這個工作。使用clearInterval來停止函數

任何幫助,將不勝感激

HTML

<input type="button" value="Start" onclick="wpm($numberWords,$speed)" /> 
<input type="button" value="Stop" onclick="stopWpm()" /> 

JS

var myTimer; 

function wpm(numberWords,speed) { 

    var input = new Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s"); 

    var output = new Array(); 
    for (var i = 0; i < input.length; i += numberWords) { 
     output.push(input.slice(i, i + numberWords).join(" ")); 
    } 

    var i=0; 
    var myTimer =setInterval(timer,speed); //1000 will run it every 1 second 
    function timer() { 
     document.getElementById("timer").innerHTML = output[i]; 
     i++; 
     if (i == output.length){ 
      clearInterval(myTimer); 
     } 
    } 
} 

function stopWpm() { 
    clearInterval(myTimer); 
} 

回答

4

你有myTimer;作爲一個全局變量和內wpm()你重新聲明它嘗試刪除varmyTimerwpm()功能

// ... 
var i=0; 
myTimer = setInterval(timer,speed); //1000 will run it every 1 second 
function timer() { 
// ... 
+0

謝謝你的幫助 - 這個作品,我現在明白了爲什麼!但是,如果我多次單擊「開始」按鈕,代碼將在循環結束時顯示「未定義」。有沒有辦法檢查函數是否已經在運行? – tomp

+0

@tomp,檢查函數是否已經在運行,做下一步:每次調用'clearInterval(myTimer)'''後添加代碼'myTimer = 0;'然後你就可以檢查函數運行了if if(myTimer){/ *代碼,如果功能運行或計劃運行* /}其他{/ *代碼如果功能不運行* /}'。並接受答案。 –

+0

謝謝安德魯 - 非常感謝! – tomp

0
I had the same problem and this worked for me: 

    var operate = function() { start = setInterval(function(){ 
    ... 
    } 
} , time); } 
    var stop = function() { clearInterval(start); } 
    return { Start: start, Stop: stop } 
    } 

使用operate.Start()內|| operate.Stop()來處理

+0

非常感謝您的回覆和幫助。 – tomp