【问题标题】:setInterval and clearInterval through button click eventssetInterval 和 clearInterval 通过按钮点击事件
【发布时间】:2017-03-01 23:17:01
【问题描述】:

这是我的代码:

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 个按钮:startstop。当我单击start 启动计时器时,我希望函数go 运行。这都很好。我的问题是试图停止计时器。

如果我将let x = setInterval(countDown, 1000); 放在stopIt() 函数之外,无论我是否单击start 按钮,它都会自动在windows.onload 上启动计时器,但这样做,我可以停止计时器。

如果我将let x = setInterval(countDown, 1000); 放入stopIt() 函数中,就像我在这里所拥有的那样,我可以随时通过单击start 按钮启动计时器,但现在我无法使用clearInterval() 停止计时器.

非常感谢任何帮助。提前致谢!

【问题讨论】:

    标签: javascript timer


    【解决方案1】:

    尝试在“go”函数中的一个变量中设置间隔的ID,在“stopIt”函数内部取消,如下所示:

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

    【讨论】:

    • 你能解释一下这背后的逻辑吗?我问是因为在 go 函数之外执行 var intervalID = setInterval(countDown, 1000); 会自动运行它。是不是像我每次点击startstop 时都替换它的标志?
    • 逻辑很简单。 setInterval() 返回将用于标识该循环的 ID,因此,如果您启动它,变量“intervalID”会被标记,因此,您可以在函数外部使用该变量来停止 stopIt() 中的标记间隔功能。如果您想控制 go() 和 stopIt() 函数的正常运行,请修改它们以在 var intervalID 是否为 null 时运行(或停止)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多