防止JS Timer

时间:2017-02-17 16:46:13

标签: javascript ruby-on-rails countdowntimer

我已经根据this问题的最多投票答案做了一个计时器。 问题是,当它达到0时,它会将日期更改为第二天并启动一个新的24小时计时器。

铊;博士 00:00:00 - > 23:59:59而不是永远停留在00:00:00。

我目前的代码:

function getTimeLeft() {
  var seconds_left = end_time - Math.floor(Date.now() / 1000);
  var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
  $('#test-time-left').text(time_left);
}
setInterval(getTimeLeft, 1000);

为了保持00:00:00,我想到了两种解决方法。

首先(并且非常好)将在条件为setInterval(getTimeLeft, 1000);的{​​{1}}循环中提供while。但我对此几乎没有问题。

  1. 我不知道如何在函数之外传递变量。

  2. 我不知道是否阻止setInterval会做任何事情,但我不妨将间隔设置为0(ergo将其关闭)。

  3. 第二种方法只是在函数内部执行seconds_left >= 0

    while

    问题:

    1. 浪费资源,因为JS脚本仍在进行中
    2. @Edit最终结果:

      while( seconds_left >= 0){
            var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
      }
      

      我还将seconds_left设置为0,以防脚本错过0秒帧(例如用户在倒计时时关闭浏览器)。

2 个答案:

答案 0 :(得分:1)

假设你想在seconds_left等于0时停止计时器,你可以简单地清除间隔:

function getTimeLeft() {
  var seconds_left = end_time - Math.floor(Date.now() / 1000);
  var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
  if(seconds_left === 0) {
    clearInterval(timer);  // clear the interval
  }
  $('#test-time-left').text(time_left);
}

var timer = setInterval(getTimeLeft, 1000);  //save the timer in a variable

请注意,您使用while循环的想法将工作:

while( seconds_left >= 0){
  var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
}

JavaScript是单线程的,这意味着在while循环运行时,区间代码将运行,因此会产生无限循环(并可能导致浏览器崩溃)。

答案 1 :(得分:0)

我同意Rick Hithcock所说的一切。这是一个基于您的代码的示例,该代码将计时器设置为10秒,然后倒计时。

var end_time = new Date();
end_time.setSeconds(end_time.getSeconds() + 10);

function getTimeLeft() {
    var now = new Date();
    var seconds_left = (end_time - now) / 1000;
    if (seconds_left <= 1) {
        clearInterval(timerID);
    }
    var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
    $('#test-time-left').text(time_left);
}
timerID = setInterval(getTimeLeft, 1000);