Javascript JS倒计时-暂停功能

Javascript JS倒计时-暂停功能,javascript,timer,Javascript,Timer,这里有一个简单的倒计时计时器,从9倒计时到0。 倒计时工作正常。但是,如果我想在中途暂停它,然后从暂停的地方重新启动,该怎么办? 我尝试过(见下面的代码)中断倒计时,保存它所在的号码,然后从新号码重新启动函数。但是倒计时开始混乱了,我不明白为什么。有什么想法吗 另外,我可以从其他地方剪切和粘贴计时器,但我这样做是为了学习经验。我确信有更好的方法可以在JS中编写倒计时程序,但让我感到困扰的是,我不能让这种方法工作,我想我肯定错过了一些明显的东西 非常感谢 var currentTimeInt=1

这里有一个简单的倒计时计时器,从9倒计时到0。 倒计时工作正常。但是,如果我想在中途暂停它,然后从暂停的地方重新启动,该怎么办? 我尝试过(见下面的代码)中断倒计时,保存它所在的号码,然后从新号码重新启动函数。但是倒计时开始混乱了,我不明白为什么。有什么想法吗

另外,我可以从其他地方剪切和粘贴计时器,但我这样做是为了学习经验。我确信有更好的方法可以在JS中编写倒计时程序,但让我感到困扰的是,我不能让这种方法工作,我想我肯定错过了一些明显的东西

非常感谢

var currentTimeInt=10;
var minn=[];
var-stop=0;
//停止
函数stopCounter(){
currentTime=document.getElementById('mins').textContent;//获取暂停时的分钟数。
停止=1;
}
//重新启动
函数重新启动(){
停止=0;
currentTimeInt=parseInt(currentTime,10);//将该数字转换为我们可以使用的整数
document.getElementById(“mins”).innerHTML=currentTimeInt;
newMinutes();//重新启动newMinutes函数,将开始时间currentTimeInt设置为计数器停止的时间
}
函数newMinutes(){
document.getElementById('mins')。innerHTML=currentTimeInt;//显示计数器
对于(aa=currentTimeInt-1;aa>=0;aa--){
minn.push(aa);//按降序构建一个数字数组
document.getElementById('mins').innerHTML=minn[aa];

对于(设bb=1;bb),您可以尝试以下示例:

var-timerId;
var计数器;
函数start(){
console.log('start');
如果(!计数器){
重置();
}否则{
loop();
}
}
函数暂停(){
console.log('pause');
if(timerId){
清除间隔(timerId);
timerId=null;
}
}
函数重置(){
console.log('reset');
暂停();
计数器=10;
loop();
}
函数循环(){
timerId=setInterval(函数(){
如果(0>=计数器){
暂停();
返回;
}
控制台日志(“计数器”,计数器);
计数器--;
}, 500);
}
开始
暂停

重置
这里的第一个问题是
currentTime
不是全局定义的,因此不能从
restart
中访问它。只需将
var currentTime;
放在文件的开头

但是你还有一个严重的问题,就是你用一种非常笨拙的方式使用了
setTimeout
。你一次创建了多个超时,并根据它们与
currentTimeInt
的关系给它们一个延迟。这有两个问题。其中一个问题是,使用两个For循环不是很有效,而且看起来像你一样冗余无论如何,你的内部for循环将计数到currentTimeInt

第二,你永远不会清除(也可能无法清除)超时。这意味着,如果暂停后没有触发任何超时,当你重新启动计时器时,你的程序将运行这些超时,并使分钟数在取消暂停后创建的旧超时和新超时之间来回跳跃

我知道在你的评论中,你说你想让它工作,因为整个事情基本上是你自己做的,但这可能不值得继续沿着这条路走下去。在看了一些之后,我认为修复你的程序需要对它进行重组,或者要求它以一种使它效率非常低的方式被黑客攻击。如果你是对于一个刚开始学习Javascript的人来说,重新开始并用正确的方式来做可能更好

下面是一个使用
setInterval
而不是
setTimeout
的更好方法的示例,但是您可以自己尝试解决这个问题

(有一些方法可以改进下面代码的功能,但应该足以让您了解总体思路)

var startTimeInt=10;
var currentTimeInt=startTimeInt;
var区间=未定义;
//启动计时器
函数startCounter(){
如果(!间隔){
document.getElementById('mins')。innerHTML=currentTimeInt;
interval=setInterval(newNumber,1000)//设置一个间隔
}
}
//停止
函数stopCounter(){
//清除间隔
清除间隔(间隔)
间隔=未定义;
}
//重置计时器
函数resetCounter(){
currentTimeInt=startTimeInt;
document.getElementById('mins')。innerHTML=currentTimeInt;
//停止计数器();开始计数器();
}
//更改时间并处理时间结束事件
函数newNumber(){
currentTimeInt--;//减少当前时间
document.getElementById('mins')。innerHTML=currentTimeInt;
如果(currentTimeInt==0){
控制台日志(“完成”);
停止计数器();
}
}
分钟:
走!
停止

重置!
这是一个工作片段。。
var暂停=false;
var=false;
var=true;
var currentCount=0;
var running=false;
间隔=1000;
最大计数=10;
函数start(){
如果(停止){
开始=真;
暂停=错误;
停止=错误;
currentCount=maxCount;
loop();running=true;
返回;
}
暂停=错误;
}
函数暂停(){
暂停=真;
}
函数停止(){
暂停=错误;
开始=错误;
停止=真;
运行=错误;
currentCount=0;
}
功能更新(项目){
document.getElementById(“status”).innerHTML=item;
//控制台日志(项目);
--电流计数;
如果(currentCount<0){stop()}
}
函数重置(){
currentCount=maxCount;
document.getElementById(“status”).innerHTML=currentCount;
}
函数循环(){
如果(!停止){
如果(!暂停){update(currentCount);}
setTimeout(函数(){loop()},间隔)
}
}
开始
暂停
重置
停止

这是我的小倒计时,具有启动、暂停、恢复、停止和重置功能:

var jqcd_start_id='input#jqcd_start';
var jqcd_time_id='输入#jqcd_time';
var jqcd_count_id='span#jqcd_count';
var jqcd_end_message='时间到了!';
var jqcd_倒计时=“”;
var jqcd_状态='已停止';
var jqcd_curre