2017-03-01 11 views
0

ここでは私のコードです:のsetIntervalとてclearInterval

window.onload = runThis; 
function runThis() { 

    const txtMin = document.getElementsByClassName("min"); 
    const txtSec = document.getElementsByClassName("sec"); 

    function go() { 
    setInterval(countDown, 1000); 
    } 

    function countDown() { 
    timeNow = timeNow - 1; 
    timeSec = timeNow % 60; //remainder as seconds 
    timeMin = Math.round((timeNow/60) - (timeSec/60)); //minutes 

    txtMin[0].innerText = 
     (timeMin > 0 ? 
     (timeMin >= 10 ? `${timeMin}:` : `0${timeMin}:`) 
     : "00:"); 

    txtSec[0].innerText = 
     (timeSec > 0 ? 
     (timeSec >= 10 ? timeSec : `0${timeSec}`) 
     : "00"); 
    } 

    function stopIt() { 
    let x = setInterval(countDown, 1000); 
    clearInterval(x); 
    } 

    const btnStart = document.getElementsByClassName("start"); 
    btnStart[0].addEventListener("click", go); 

    const btnStop = document.getElementsByClassName("stop"); 
    btnStop[0].addEventListener("click", stopIt); 
} 

私はトラブルのsetIntervalとてclearIntervalを設定しようとしているが生じています。 2つのボタン:startstopstartをクリックしてタイマーを開始すると、機能goが実行されます。それはすべて良いです。私の問題は、タイマーを停止しようとしています。

私はstopIt()関数の外let x = setInterval(countDown, 1000);を置く場合は、自動的にかかわらず、私はstartボタンをクリックしますが、そうすることで、私はタイマーを停止できるかどうかのwindows.onloadにタイマーを開始します。

私は私がここに持っているもののようなstopIt()関数内let x = setInterval(countDown, 1000);を入れた場合、私はstartボタンをクリックすることにより、いつでもタイマーを起動することができますが、今、私はclearInterval()を使用してタイマーを停止することはできません。

ご協力いただきまして誠にありがとうございます。前もって感謝します!

答えて

2

はこのように、外側の「stopIt」関数の内部でキャンセルされるように、変数に「行く」機能でインターバルのIDを設定してください:

window.onload = runThis; 
function runThis() { 
    var intervalID = null; 
    const txtMin = document.getElementsByClassName("min"); 
    const txtSec = document.getElementsByClassName("sec"); 

    function go() { 
    intervalID = setInterval(countDown, 1000); 
    } 

    function countDown() { 
    timeNow = timeNow - 1; 
    timeSec = timeNow % 60; //remainder as seconds 
    timeMin = Math.round((timeNow/60) - (timeSec/60)); //minutes 

    txtMin[0].innerText = 
     (timeMin > 0 ? 
     (timeMin >= 10 ? `${timeMin}:` : `0${timeMin}:`) 
     : "00:"); 

    txtSec[0].innerText = 
     (timeSec > 0 ? 
     (timeSec >= 10 ? timeSec : `0${timeSec}`) 
     : "00"); 
    } 

    function stopIt() { 
    clearInterval(intervalID); 
    } 

    const btnStart = document.getElementsByClassName("start"); 
    btnStart[0].addEventListener("click", go); 

    const btnStop = document.getElementsByClassName("stop"); 
    btnStop[0].addEventListener("click", stopIt); 
} 
+0

を、あなたは、この背後にあるロジックを説明することができますか? 'go'関数の外側で' var intervalID = setInterval(countDown、1000); 'を実行すると自動的に実行されるので、私は尋ねています。 'start'や' stop'をクリックするたびに置き換えられるフラグのようなものですか? – Rumba

+0

ロジックはシンプルです。 setInterval()はそのループを識別するために使用されるIDを返します。開始すると変数 "intervalID"がマークされるので、その変数を関数の外で使用してstopIt()関数。 go interval()およびstopIt()関数が適切に動作するように制御する場合は、var intervalIDがnullであるかどうかを確認して実行(または停止)するように変更します。 –

関連する問題