【问题标题】:JavaScript Timer PauseJavaScript 定时器暂停
【发布时间】:2012-07-18 18:54:16
【问题描述】:

代码如下。您将如何设置一个按钮来暂停计时器并在按下恢复时恢复?下面的 // 标记是我放置暂停和恢复标签的位置。谢谢大家的帮助!!

<head>
<script type="text/javascript">

var d1 = new Date();
d1.setHours(1,0,0);

function f(){
var h= d1.getHours();
var m= d1.getMinutes();
var s=d1.getSeconds();
m= (m<10)?"0"+m: m;
s= (s<10)? "0"+s : s;

var el= document.getElementById("inputid");
el.value= h+":"+m+":"+s;
d1.setSeconds(d1.getSeconds()-1);
if( h==0 && m==0 && s==0 ) clearTimeout(t)
var t= setTimeout("f()",1000);
}

</script>
</head>
<body>
<form><input type="text" id="inputid"></form>
<script type="text/javascript">f()</script>

//pause and resume buttons would go here.
</body>

【问题讨论】:

    标签: javascript timer


    【解决方案1】:

    您可以通过 clearTimeout() 停止超时,将 setTimeout 的返回值传递给它,或者在您的情况下为 t

    现场示例:http://jsfiddle.net/tJWmH/

    另一个指针:不要将字符串传递给setTimeout,而是传递函数引用,所以:

    var t = setTimeout(f,1000)
    

    代替

    var t = setTimeout("f()",1000);
    

    如果您想知道原因,请搜索"eval is evil".

    【讨论】:

    • 感谢您的快速回复!
    【解决方案2】:

    另一种方法是:按下按钮时,设置一个变量,如paused。在您的 f 函数中,如果 paused 为真,则立即返回。

    setInterval(function(){
      if (paused) return;
      // update the dom
    }, 1000);
    

    输入

    <input type="button" value="Pause" onClick="window.paused=true" />
    

    Here is a basic fiddle

    【讨论】:

    • 恢复按钮设置paused=false
    • 认为您需要将其更改为setInterval,否则如果您暂停,该功能将不会重新安排。
    • 不,setTimeout 也可以,他只有在计数器达到零时才清除超时(还需要有一个 else 分支)。所以没关系。看看我对你问题的回答!
    【解决方案3】:

    这不是我的代码。我找到了它并在我的项目中使用。这是原帖:https://stackoverflow.com/a/3969760/1250044

    Timer = function(callback, delay) {
      var timerId, start, remaining = delay;
    
      this.pause = function() {
        window.clearTimeout(timerId);
        remaining -= new Date() - start;
      };
    
      this.resume = function() {
        start = new Date();
        timerId = window.setTimeout(callback, remaining);
      };
    
      this.resume();
    };
    

    使用:

    var t = new Timer(function(){
     /* ... */
    }, 500);
    
    t.pause();
    t.resume();
    

    【讨论】:

      【解决方案4】:

      试试这个:

      var d1 = new Date();
      d1.setHours(1,0,0);
      var t;
      
      
      function f() {
          var h= d1.getHours();
          var m= d1.getMinutes();
          var s=d1.getSeconds();
          m= (m < 10) ? ('0'+m) : m;
          s= (s < 10) ? ('0'+s) : s;
      
          var el= document.getElementById("inputid");
          el.value = h+":"+m+":"+s;
      
          if( h==0 && m==0 && s==0 ) {
              clearTimeout(t)
              return;   
          }
          d1.setSeconds(d1.getSeconds()-1);
      
          t= setTimeout(f,1000);
      
      }
      
      function pause() {
          clearTimeout(t);
      }
      function resume() {
          t= setTimeout(f,1000);
      }
      resume();
      

      你只需调用 pause() 来暂停它,然后调用 resume() 来恢复它。而已! 请注意,我调用 resume() 一次,只是为了启动计数器。

      编辑:您必须在递减之前检查它是否达到零,然后返回,以便按恢复不会继续工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        相关资源
        最近更新 更多