计数器归零或复位后的清零间隔

clearing interval after counter reach 0 or reset

我正在尝试制作简单的游戏,但在管理计数器和在计数器达到 0 或单击重置按钮后清除间隔时遇到问题。当它达到 0 时它会工作,但是当我尝试将它实现为重置按钮时,计数器正在重置但随后以双倍速度运行。

let counter = 60;
let healthPoints = 3;
let points = 0;

document.querySelector('.reset').addEventListener('click', resetGame);


function countTime() {
    const timer = document.querySelector('.timer');
    const countTime = setInterval(function () {
        counter--;
        timer.innerHTML = + counter;
        if (counter == 0) {
            alert('Game over')
            clearInterval(countTime);
        }
    }, 1000)
}

function resetGame() {
    newBoard();
    counter = 60;
    healthPoints = 4;
    points = 0;
    clearInterval(countTime);
}

setInterval returns 当您想停止计时器时传递给 clearInterval() 的值。您需要将其保存在 resetGame() 可以看到的范围内。您在 countTime() 内声明,这意味着它仅在此处的范围内。

这里我将其命名为 interval 并将其定义在两个函数之外,以便两个函数都可以访问它:

let counter = 60;
let healthPoints = 3;
let points = 0;
let interval;

document.querySelector('.reset').addEventListener('click', resetGame);


function countTime() {
    const timer = document.querySelector('.timer');
    interval = setInterval(function () {
        counter--;
        timer.innerHTML = + counter;
        if (counter == 0) {
            alert('Game over')
            clearInterval(interval);
        }
    }, 1000)
}

function resetGame() {
    counter = 60;
    healthPoints = 4;
    points = 0;
    clearInterval(interval);
    countTime()
}

countTime()
<button class="reset">Reset</button>
<div class = "timer"></div>

因为你并没有真正清除间隔,你必须提供给clearInterval函数,它需要一个间隔id才能知道清除哪个间隔。参见 https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval

这个id实际上是调用setInterval函数时返回的,所以你的countTime变量就是你的interval ID。

这就是为什么当它达到零时它起作用的原因是你通过将它的 id 提供给 clearInterval 函数来正确地清除间隔,相反你只是在你的 resetGame 函数中提供对 clearInterval 函数的函数引用

因此,您实际上可以从 countTime 返回 intervalId 并将其提供给您的 resetGame 函数:

function countTime() {
    ...
    const timer = document.querySelector('.timer');
    // I renamed it just to be clear
    const countTimeIntervalID = setInterval(function () {
    counter--;
    timer.innerHTML = + counter;
    if (counter == 0) {
        alert('Game over')
        clearInterval(countTime);
    }
 }, 1000)
   return countTimeIntervalID
}
let countTimeIntervalID = countTime();
function resetGame() {
     ...
    clearInterval(countTimeIntervalID);
}

另外,请注意,当您点击重置按钮时,计数器时间加倍的原因是因为您没有清除第一个,它仍然是 运行,所以实际上有间隔运行 并更新相同的 .timer dom 元素

您传递给 resetGame 函数内的 clearInterval 函数的 countTime 参数是对名为 countTime 的函数的引用。您需要重命名变量并在全局声明它:

let counter = 60;
let healthPoints = 3;
let points = 0;
let t = null;
document.querySelector('.reset').addEventListener('click', resetGame);
function countTime() {
    const timer = document.querySelector('.timer');
    t = setInterval(function () {
    counter--;
    timer.innerHTML = + counter; 
    if (counter == 0) {
      alert('Game over')     
      clearInterval(t);
    }
   }, 1000)
 }

function resetGame() {
  newBoard();
  counter = 60;
  healthPoints = 4;
  points = 0;
  clearInterval(t);
}