2

我有这个计时器代码,我试图让它在 0:0 停止,但它一直变成负数。任何解决此问题的想法都会有所帮助。

<html>
  <head>
    <script>
      function startTimer(m,s)
      {
        document.getElementById('timer').innerHTML= m+":"+s;
        if (s==0)
        {
          if (m == 0)
          {
            clearTimeout(t);
          }
          else if (m != 0)
          {
            m = m-1;
            s = 60;
          }
        }
        s = s-1;
        t=setTimeout(function(){startTimer(m,s)},1000);
      }
    </script>
  </head>

  <body>
    <button onClick = "startTimer(0,5)">Start</button>

    <p id = "timer">00:00</p>
  </body>
</html>
4

4 回答 4

4

你总是在 结束时触发一个新的计时器startTimer,即使你达到零。快速解决方法是添加return; after而不是clearTimeout(t);.

于 2013-04-21T12:53:43.427 回答
0

只是一个评论 - 该功能可以更苗条:

function pad(n) {
  return (n<10? '0':'') + n;
}

function startTimer(m,s) {
  document.getElementById('timer').innerHTML = pad(m) + ":" + pad(s);
  s -= s? 1 : m-- && -59;
  if (m != -1) 
    setTimeout(function(){startTimer(m,s)},1000);
}

它会慢慢漂移,因为 setTimeout 没有在指定的时间运行,因此它应该使用日期对象将延迟调整到下一整秒。

于 2013-04-21T14:21:15.383 回答
0

您可以将超时函数设为外部并在时间超过 0:0 时调用它,如下所示:

  function startTimer(m,s)
  {
    document.getElementById('timer').innerHTML= m+":"+s;
    if (s==0)
    {
      if (m == 0)
      {
        alert('done');
      }
      else if (m != 0)
      {
        m = m-1;
        s = 60;
        t();
      }
    }
    s = s-1;
    t();
    function t(){setTimeout(function(){startTimer(m,s)},1000)};
  }

或速记版本:

  function startTimer(m,s)
  {
    document.getElementById('timer').innerHTML= m+":"+s;
      (s == 0) ? (m == 0 ? alert('done') : (m--, s = 60, t())) : (s--, t());
      function t(){ setTimeout(function(){startTimer(m,s)},1000)};
  }

jsfiddle

于 2013-04-21T13:32:42.987 回答
-1

它是我写的旧代码:

          function CountDown(TimeToCount){

        if(First)
        {
            var startDatum=new Date();
            First = false;
            date.a = startDatum;
            bye = TimeToCount-200;
        }
        if(bye > 0 && CDown){
            var zielDatum=new Date();
            bye =Math.abs(Math.floor(( ((zielDatum-(TimeToCount-200)-date.a)/1000) - 0.1)*10)/10);

            if ( bye * 10 % 10 ==0)

                $(".CountDown").html(bye+".0");
            else
                $(".CountDown").html(bye);
            setTimeout(function(){CountDown(TimeToCount)},20);

        }
            else
        {           $(".CountDown").html("0.0");

        }
               }`
于 2013-04-21T12:56:28.253 回答