定时器在达到零时不会结束

时间:2013-12-08 15:06:16

标签: javascript timer intervals countdown

我一直在研究这个javascript计时器,并且无法理解为什么它在小时,分钟和秒等于零时不会停止。

代码:

var s= 18000;
var h= Math.floor(s/3600);
s-= h*3600;
var m= Math.floor(s/60);
s -= m*60;
var counter=setInterval(timer, 1000); //1000 will  run it every 1 second

function timer()
{
  if(s == 0 ){
    if(m == 0){
      h=h-1;
      s=59;
      m=59;
      if(h == 0){
        clearInterval(counter);
      }
    } else {
      m=m-1;
      s=59;
    }
    //Do code for showing the number of seconds here
  } else {
    s = s - 1;
  }
  document.getElementById("timer").innerHTML=h+'hrs '+m+'min '+s+'secs ';
}

2 个答案:

答案 0 :(得分:1)

我在这里看到的问题是,当所有时间变量时,你将h变量减1,而时间变量我的意思是h,{{1} }和m设置为零:

s

所以if(s == 0 ) { if(m == 0) { h=h-1; s=59; m=59; // more code goes here 将是h,计时器永远不会停止 我可以提出的最好的方法是完全重写你的计时器,并在这里使用秒。每次调用-1函数时,检查timer是否等于零 - 如果是,则停止计时器。否则,您将s递减1.要更新s元素的内部HTML,您可以重新计算每次调用#timer方法的小时数,分钟数和秒数 - 此解决方案将比嵌套条件语句链更容易理解和维护。

答案 1 :(得分:0)

问题似乎是本节中的逻辑......

 if(s == 0 ){
    if(m == 0){
      h=h-1;   // what if h is also 0 here??   this would set it negative
      s=59;
      m=59;
      if(h == 0){
        clearInterval(counter);
      }

我认为你应该在递减价值之前尽快进行if(h==0)检查。因此,您可能希望使用if (s == 0 && m == 00 && h == 0)启动if else块并使用它来清除间隔。如果一切都已为零,则您不想再更改任何值。