【问题标题】:Countdown timer stops ticking when the phone screen is locked手机屏幕锁定时倒计时停止计时
【发布时间】:2020-04-26 15:47:08
【问题描述】:

我编写了一个代码 - 一个测量输入秒数的计时器。当我锁定手机屏幕时,计时器会倒计时,在长时间解锁屏幕后,计时器会在锁定屏幕后停止几秒钟。有没有办法解决这个问题?

document.getElementById('btn').addEventListener('click',function(){
  var workSeconds = parseInt(document.getElementById('work-seconds').value);
  var workSecondsCount = workSeconds;
  var worktimer = setInterval(workSecCount,1000);
  function workSecCount(){
    workSecondsCount--;
    workSecondsCount < 10 ? document.getElementById('workSecs').textContent = "0" + workSecondsCount : document.getElementById('workSecs').textContent = workSecondsCount;
    if(workSecondsCount == 0){
      document.getElementById('workSecs').textContent = "DONE";
      workSecondsCount = workSeconds;
      clearInterval(worktimer);
    }
  };
});
<input type="number" id="work-seconds" placeholder="seconds" min="0">
<button id="btn">START</button>
<p>Work Timer : <span id="workSecs"></span></p>

【问题讨论】:

    标签: javascript html timer


    【解决方案1】:

    你需要依赖当前时间而不是workSecondsCount,然后你可以补偿时间差距。

    var worktimer = 0;
    document.getElementById('btn').addEventListener('click',function(){
      if (!worktimer) clearInterval(worktimer);
      var workSeconds = parseInt(document.getElementById('work-seconds').value);
      var workSecondsCount = new Date().getTime() + workSeconds * 1000;
      function workSecCount(){
        const secondsCount = Math.ceil((workSecondsCount  - new Date().getTime()) / 1000);
        secondsCount < 10 ? document.getElementById('workSecs').textContent = "0" + secondsCount : document.getElementById('workSecs').textContent = secondsCount;
        if(secondsCount <= 0){
          document.getElementById('workSecs').textContent = "DONE";
          if (worktimer) {
            clearInterval(worktimer);
            worktimer = 0;
          }
        }
      };
      workSecCount();
      worktimer = setInterval(workSecCount,1000);
    });
    

    【讨论】:

    • 哇!我非常感谢你!但是为什么倒计时会开始呢,比如我输入20s,就从18s开始呢?
    • 因为setInterval的原因,1000ms后执行函数,需要在声明后立即调用函数。我会更新答案。我也把floor改成了Math.ceil,现在应该更好了。
    • 有时,虽然很少见,但如果我点击开始按钮开始倒计时,秒数会每 2 秒而不是 1 秒倒计时。你知道这有什么作用吗?
    • 你帮了我很多忙!谢谢!
    • 好的,我今晚去看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多