【问题标题】:How to use event handlers with "update" function to start and stop a stopwatch如何使用具有“更新”功能的事件处理程序来启动和停止秒表
【发布时间】:2019-07-14 20:38:42
【问题描述】:

我需要将事件处理程序附加到更新函数,以便停止按钮将停止时间,而开始按钮将再次启动它。

我已经尝试了多种方法来做到这一点,函数处理程序显示了这一点。但我似乎无法让它发挥作用。

stop = document.getElementById('Stop');
        var watchRunning = new Boolean(false);

        Start.addEventListener('click', startHandler);

        function startHandler() {
            d.watchRunning = true;
        }

        Stop.addEventListener('click', stopHandler);

        function stopHandler() {
            stop.onclick = function() {
                clearTimeout(watchRunning);
            }
        }

        update();
        var testVar = window.setInterval(update, 10);
        var seconds;
        var milliseconds;
        var d;

        function update() {
            d = new Date();
            seconds = d.getSeconds();
            milliseconds = Math.floor((d.getMilliseconds() / 10));

            if (milliseconds < 10 && seconds < 10) {
                document.getElementById("Time").innerHTML =
                    "0" + seconds + ":0" + milliseconds;

            } else if (milliseconds < 10 && seconds >= 10) {
                document.getElementById("Time").innerHTML =
                    seconds + ":0" + milliseconds;

            } else if (milliseconds >= 0 && seconds < 10) {
                document.getElementById("Time").innerHTML =
                    "0" + seconds + ":" + milliseconds;

            } else if (milliseconds >= 0 && seconds >= 10) {
                document.getElementById("Time").innerHTML =
                    seconds + ":" + milliseconds;
            }
        }
#Time {
            background-color: yellow;
            max-width: 5%;
        }
<h1>Stop Watch</h1>
    <button id="Start">Start</button>
    <button id="Stop">Stop</button>
    <h3>Elapsed Time:</h3>
    <p id="Time"></p>

有什么可以做的吗?我需要在哪里更新我的更新功能?任何提示都有帮助。

【问题讨论】:

    标签: javascript html button event-handling stopwatch


    【解决方案1】:

    如果您想减少时间,可以这样做。

    1. 开始时,记下当前时间。
    2. 更新时,查看自上次记下以来经过了多少时间,将其添加到经过的总时间中,再次记下当前时间。
    3. 在停止时,停止更新计时器。

    剧透:

    const stop = document.getElementById('Stop');
    const start = document.getElementById('Start');
    let watchIntervalTimer;
    let countingSince;
    
    function startHandler() {
        if (!watchIntervalTimer) {  // If it's not set.
            watchIntervalTimer = setInterval(updateTimer, 10);
            countingSince = Date.now();
        }
    }
    
    function stopHandler() {
        clearInterval(watchIntervalTimer);
        watchIntervalTimer = null;  // So we can identify that it's reset.
    }
    
    Start.addEventListener('click', startHandler);
    Stop.addEventListener('click', stopHandler);
    
    var seconds;
    var milliseconds;
    var d;
    let timePassed = 0;
    updateLabel();
    
    function updateTimer() {
        timePassed += Date.now() - countingSince;
        countingSince = Date.now();
        updateLabel();
    }
    
    function updateLabel() {
        d = new Date(timePassed);
        seconds = d.getSeconds();
        milliseconds = Math.floor((d.getMilliseconds() / 10));
    
        if (milliseconds < 10 && seconds < 10) {
            document.getElementById("Time").innerHTML =
                "0" + seconds + ":0" + milliseconds;
    
        } else if (milliseconds < 10 && seconds >= 10) {
            document.getElementById("Time").innerHTML =
                seconds + ":0" + milliseconds;
    
        } else if (milliseconds >= 0 && seconds < 10) {
            document.getElementById("Time").innerHTML =
                "0" + seconds + ":" + milliseconds;
    
        } else if (milliseconds >= 0 && seconds >= 10) {
            document.getElementById("Time").innerHTML =
                seconds + ":" + milliseconds;
        }
    }
    #Time {
        background-color: yellow;
        max-width: 5%;
    }
    <h1>Stop Watch</h1>
    <button id="Start">Start</button>
    <button id="Stop">Stop</button>
    <h3>Elapsed Time:</h3>
    <p id="Time"></p>

    【讨论】:

      【解决方案2】:

      好吧,我要做的只是setInterval 当“开始”被按下时,如果它还没有设置的话;和clearInterval 在“停止”。 剧透:

      const stop = document.getElementById('Stop');
      const start = document.getElementById('Start');
      let watchIntervalTimer;
      
      function startHandler() {
          if (!watchIntervalTimer) {  // If it's not set.
              watchIntervalTimer = setInterval(update, 10);
          }
      }
      
      function stopHandler() {
          clearInterval(watchIntervalTimer);
          watchIntervalTimer = null;  // So we can identify that it's reset.
      }
      
      Start.addEventListener('click', startHandler);
      Stop.addEventListener('click', stopHandler);
      
      update();
      var seconds;
      var milliseconds;
      var d;
      
      function update() {
          d = new Date();
          seconds = d.getSeconds();
          milliseconds = Math.floor((d.getMilliseconds() / 10));
      
          if (milliseconds < 10 && seconds < 10) {
              document.getElementById("Time").innerHTML =
                  "0" + seconds + ":0" + milliseconds;
      
          } else if (milliseconds < 10 && seconds >= 10) {
              document.getElementById("Time").innerHTML =
                  seconds + ":0" + milliseconds;
      
          } else if (milliseconds >= 0 && seconds < 10) {
              document.getElementById("Time").innerHTML =
                  "0" + seconds + ":" + milliseconds;
      
          } else if (milliseconds >= 0 && seconds >= 10) {
              document.getElementById("Time").innerHTML =
                  seconds + ":" + milliseconds;
          }
      }
      #Time {
          background-color: yellow;
          max-width: 5%;
      }
      <h1>Stop Watch</h1>
      <button id="Start">Start</button>
      <button id="Stop">Stop</button>
      <h3>Elapsed Time:</h3>
      <p id="Time"></p>

      【讨论】:

      • 当我点击停止时,它停止正常。但是当我再次单击开始时,它从不同的时间开始。就好像时间还在流逝一样,只有点击“停止”时动画才会停止。
      • 您能解释一下为什么会这样吗?
      • d = new Date(); 在每次更新时,您都会获得当前系统时间。为防止这种情况发生,您可以创建自己的变量并在每次 update() 调用时为其添加 10(毫秒)。然后,要将毫秒转换为时间,您可以在 Date 对象上使用 setMilliseconds(您可以使用 new Date(0) 对其进行初始化。
      • 有没有办法在更新函数之前用“new Date()”定义一个变量。然后在更新函数内部减去之前的“new Date()”和当前的“new Date()”?希望这是有道理的。
      • 嗯,是的。您可以在每次启动计时器时记住当前时间,并在每次更新时从当前时间中减去它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      相关资源
      最近更新 更多