@ayasaka

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

clearIntervalが聞かない

解決したいこと

ここに解決したい内容を記載してください。
setIntervalをしようしてストップ、リセットを押したときにclearIntervalを実行しているのですが、なぜか止まりません。どこがまちがっているのでしょうか?

問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

言語名 JavaScript
ソースコードを入力

    let startTime = 0;
    let elapsedTime = 0;
    let timeoutId;

    let timer = document.getElementById('timer');
    let start = document.getElementById('start');
    let stop = document.getElementById('stop');
    let reset = document.getElementById('reset');

    function countUp() {
        let d = new Date(Date.now() - startTime + elapsedTime).getTime();
        let t = (Math.floor(d / (1000 * 60 * 60))).toString().padStart(2, '0');
        d = new Date(Date.now() - startTime + elapsedTime);
        let m = d.getMinutes().toString().padStart(2, '0');
        let s = d.getSeconds().toString().padStart(2, '0');
        timer.textContent = `${t}:${m}:${s}`;
        timeoutId = setInterval(() => {
            countUp();
        }, 1000);
    }

    start.addEventListener('click', () => {
        startTime = Date.now();
        countUp();
    });

    stop.addEventListener('click', () => {
        clearInterval(timeoutId);
        elapsedTime += Date.now() - startTime;
    });

    reset.addEventListener('click', () => {
        clearInterval(timeoutId);
       elapsedTime = 0;
       timer.textContent = '00:00:00';
    });
0 likes

2Answer

setTimeout()と違ってsetInterval()は一度セットしたら繰り返し実行されるので、countUp()の中ではなくstartボタンをクリックするイベントリスナ側で実行するのが正解ですね。

現状ではcountUp()が実行されるごとにsetInterval()が積み重なってしまっているので、clearInterval()を実行してもクリアされるのは最後の1個のみで、積み重なっている残りは実行され続けている状態になっています。

0Like

Comments

  1. @ayasaka

    Questioner

    そういうことだったんですね。ありがとうございます。謎が解けました。
reset.addEventListener("click", () => {
  clearTimeout(timeoutId);
  elapsedTime = 0;
  timer.textContent = "00:00:00";
});

こっちはclearTimeoutを使っているからとか?

0Like

Comments

  1. @ayasaka

    Questioner

    その部分を直すのを忘れていました。ご指摘ありがとうございます。

Your answer might help someone💌