JavaScript定时器暂停

JavaScript定时器暂停,javascript,timer,Javascript,Timer,代码如下。按resume时,如何设置暂停计时器和继续的按钮?下面的//标记是我放置暂停和恢复标记的位置。谢谢你的帮助 <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)?"

代码如下。按resume时,如何设置暂停计时器和继续的按钮?下面的//标记是我放置暂停和恢复标记的位置。谢谢你的帮助

<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>

var d1=新日期();
d1.设定时间(1,0,0);
函数f(){
var h=d1.getHours();
var m=d1.getMinutes();
var s=d1.getSeconds();

m=(m您可以通过
clearTimeout()
传递
setTimeout
的返回值来停止超时,或者在您的情况下,
t

实例:

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

var t = setTimeout(f,1000)
代替

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

如果您想知道原因,请搜索

另一种方法是:按下按钮时,设置一个变量,如
paused
。在
f
函数中,如果paused为true,只需立即返回即可

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



这不是我的代码。我找到了它并在我的项目中使用。以下是原始帖子:

使用:

试试这个:

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();
var d1=新日期();
d1.设定时间(1,0,0);
变量t;
函数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;
如果(h==0&&m==0&&s==0){
清除超时(t)
返回;
}
d1.setSeconds(d1.getSeconds()-1);
t=设置超时(f,1000);
}
函数暂停(){
清除超时(t);
}
功能恢复(){
t=设置超时(f,1000);
}
恢复();
您只需调用pause()来暂停它,然后调用resume()来恢复它。就是这样! 请注意,我调用resume()一次,只是为了启动计数器


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

感谢您的快速响应!resume按钮设置
pause=false
认为您需要将其更改为
setInterval
,否则如果您暂停,功能将不会重新安排。不,setTimeout也可以,只有当计数器达到零时,他才会清除超时(还需要一个else分支)。所以这没关系。请参阅我对您问题的回答!
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();
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();