Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript时钟计数超过60分每秒_Javascript_Html_Css - Fatal编程技术网

Javascript时钟计数超过60分每秒

Javascript时钟计数超过60分每秒,javascript,html,css,Javascript,Html,Css,我制作了一个Javascript时钟,当秒和分钟达到60时,它将计数超过60并继续运行 函数增量{ ifrunning==1{ setTimeoutfunction{ Dtime++; var小时数=Math.floorDtime/10/3600; 如果小时数当数字超过60时,可以使用%将其换回0 比如说 59 % 60 === 59 60 % 60 === 0 61 % 60 === 1 因此,您的代码如下所示: 函数增量{ 如果正在运行==1{ setTimeoutfunction{ D

我制作了一个Javascript时钟,当秒和分钟达到60时,它将计数超过60并继续运行

函数增量{ ifrunning==1{ setTimeoutfunction{ Dtime++; var小时数=Math.floorDtime/10/3600; 如果小时数当数字超过60时,可以使用%将其换回0

比如说

59 % 60 === 59 60 % 60 === 0 61 % 60 === 1 因此,您的代码如下所示:

函数增量{ 如果正在运行==1{ setTimeoutfunction{ Dtime++; var小时数=Math.floorDtime/10/3600; 如果小时数当一个数字超过60时,您可以使用%返回到0

比如说

59 % 60 === 59 60 % 60 === 0 61 % 60 === 1 因此,您的代码如下所示:

函数增量{ 如果正在运行==1{ setTimeoutfunction{ Dtime++; var小时数=Math.floorDtime/10/3600; 如果小时数可以使用String.padStart为数字值插入0符号

您可以使用setInterval,而不是在setTimeout内调用递归函数。 要清除时间处理程序,可以使用clearInterval

setInterval的第二个参数是毫秒值,所以要以秒为单位计算时间,最好设置1000-1秒

设Dtime=0; 设置间隔函数{ Dtime++; const hours=Math.floorDtime/3600.toString; const mins=Math.floorDtime%3600/60.toString; 常数秒=数据时间%60.toString; document.getElementByIdoutputt.innerHTML=hours.padStart2,'0'+:+mins.padStart2,'0'+:+secs.padStart2,'0'; }, 1000; 00:00:00您可以使用String.padStart为数字值插入0符号

您可以使用setInterval,而不是在setTimeout内调用递归函数。 要清除时间处理程序,可以使用clearInterval

setInterval的第二个参数是毫秒值,所以要以秒为单位计算时间,最好设置1000-1秒

设Dtime=0; 设置间隔函数{ Dtime++; const hours=Math.floorDtime/3600.toString; const mins=Math.floorDtime%3600/60.toString; 常数秒=数据时间%60.toString; document.getElementByIdoutputt.innerHTML=hours.padStart2,'0'+:+mins.padStart2,'0'+:+secs.padStart2,'0'; }, 1000;
00:00:00您不能相信setTimeout或setInterval会在X毫秒内执行。请查看about事件循环以了解原因。在编写javascript时,您应该了解这一点

相反,您需要做的是在每次屏幕重新绘制时更新输出元素,这是您可以使用的。您需要存储时钟开始的时间(以毫秒为单位),然后根据该时间计算开始时间与当前时间之间的差值(带日期)。现在,当窗口即将重新绘制时。请求AnimationFrame将回调作为参数,它应该是更新输出元素的方法

编辑:我加快了计时器,以显示分秒重置

const outputElement=document.getElementByIdoutput; var startTime=0; 功能启动器{ startTime=Date.now; 更新程序; } 函数更新程序{ 让differenceInMillis=Date.now-startTime; 设{hours,minutes,seconds}=CalculateMediaDifferenceInMillis; 让timeStr=`${padhurs}:${padminutes}:${padseconds}`; outputElement.innerText=timeStr; RequestAnimationFrameUpdateTime; } 函数计算时间单位毫秒{ const SECONDS=10;//应该是1000-只有10才能加速计时器 常数分钟=60; 常数小时=60; 常数重置=60; 设小时=Math.floortimeInMillis/SECONDS/MINUTES/hours; 让分钟=Math.floortimeInMillis/SECONDS/minutes%重置; 让秒数=Math.floortimeInMillis/seconds%重置; 返回{小时,分钟,秒}; } 函数padtime{ 返回时间.toString.padStart2,'0'; } startTimer;
00:00:00您不能相信setTimeout或setInterval会在X毫秒内执行。请查看about事件循环以了解原因。在编写javascript时,您应该了解这一点

相反,您需要做的是在每次屏幕重新绘制时更新输出元素,这是您可以使用的。您需要存储时钟开始的时间(以毫秒为单位),然后根据该时间计算开始时间与当前时间之间的差值(带日期)。现在,当窗口即将重新绘制时。请求AnimationFrame将回调作为参数,它应该是更新输出元素的方法

编辑:我加快了计时器,以显示分秒重置

const outputElement=document.getElementByIdoutput; var startTime=0; 功能启动器{ startTime=Date.now; 更新程序; } 函数更新程序{ 让differenceInMillis=Date.now-startTime; 设{小时,分钟,秒}=calculateTi 中分化细胞; 让timeStr=`${padhurs}:${padminutes}:${padseconds}`; outputElement.innerText=timeStr; RequestAnimationFrameUpdateTime; } 函数计算时间单位毫秒{ const SECONDS=10;//应该是1000-只有10才能加速计时器 常数分钟=60; 常数小时=60; 常数重置=60; 设小时=Math.floortimeInMillis/SECONDS/MINUTES/hours; 让分钟=Math.floortimeInMillis/SECONDS/minutes%重置; 让秒数=Math.floortimeInMillis/seconds%重置; 返回{小时,分钟,秒}; } 函数padtime{ 返回时间.toString.padStart2,'0'; } startTimer;
00:00:00这对于您正在做的事情来说有点过分,但是它有一个很好的时间字符串格式设置方法。它还显示了如何使用Date.now跟踪时差

类秒表{ 开始时间=0 以前的持续时间=0 currentDuration=0 定时器=空; 侦听器={ 更新:[], 标记:[], 重置:[] } 分数=[] 开始{ 如果这个计时器返回; this.previousDuration+=this.currentDuration; 此.currentDuration=0; this.startTime=Date.now; 这个.跑; } 停止{ 如果!这个.timer返回; 这是一个持续时间; window.clearTimeoutthis.timer; this.timer=null; } 跑{ 这是一个持续时间; this.timer=window.setTimeoutthis.run.bindthis,10; } 设定持续时间{ this.currentDuration=Date.now-this.startTime; 触发“更新”; } 触发evtName{ 常量详细信息={ 时间:this.msToTimethis.currentDuration+this.previousDuration, 马克:[……这个。马克] }; this.listeners[evtName].forEachcb=>cbdetails; } 标记{ this.marks.pushthis.msToTimethis.currentDuration+this.previousDuration; 这个。触发‘标记’; } 重置{ 如果this.timer window.clearTimeoutthis.timer; 此.currentDuration=0; this.previousDuration=0; 此参数为.marks=[]; 触发“更新”; 这个。触发“重置”; } 在事件上,回调{ var arr=this.listeners[event]; if!arr抛出“未知事件${event}”; arr.pushcallback; 归还这个; } msToTime持续时间{ 让毫秒数=parseIntduration%1000; 设秒数=Math.floorduration/1000%60; 分钟数=Math.floorduration/1000*60%60; 让小时数=数学总小时数/1000*60*60%24; 小时=hours.toString.padStart2,“0”; 分钟=分钟.toString.padStart2,'0'; 秒=秒.toString.padStart2,“0”; 毫秒=毫秒.toString.padStart3,“0”; 返回时间+:+分钟+:+秒+.+毫秒; } } const out=document.querySelectorout; const list=document.querySelectorlist; const myStopWatch=新秒表; myStopWatch .on'update',functiondata{ out.textContent=data.time; } .on'mark',functiondata{ var li=document.createElementli; li.textContent=data.marks.pop; 李斯特; }.在“重置”功能上{ list.innerHTML=; }; const wrapper=document.querySelectoractions; wrapper.addEventListenerclick,函数evt{ const action=evt.target.dataset.action; myStopWatch[行动]; }; 开始 停止 标记时间 重置
这对于您正在做的事情来说有点过分了,但是它有一个很好的方法来格式化时间字符串。它还显示了如何使用Date.now跟踪时差

类秒表{ 开始时间=0 以前的持续时间=0 currentDuration=0 定时器=空; 侦听器={ 更新:[], 标记:[], 重置:[] } 分数=[] 开始{ 如果这个计时器返回; this.previousDuration+=this.currentDuration; 此.currentDuration=0; this.startTime=Date.now; 这个.跑; } 停止{ 如果!这个.timer返回; 这是一个持续时间; window.clearTimeoutthis.timer; this.timer=null; } 跑{ 这是一个持续时间; this.timer=window.setTimeoutthis.run.bindthis,10; } 设定持续时间{ this.currentDuration=Date.now-this.startTime; 触发“更新”; } 触发evtName{ 常量详细信息={ 时间:this.msToTimethis.currentDuration+this.previousDuration, 马克:[……这个。马克] }; this.listeners[evtName].forEachcb=>cbdetails; } 标记{ this.marks.pushthis.msToTimethis.currentDuration+this.previousDuration; 这个。触发‘标记’; } 重置{ 如果this.timer window.clearTimeoutthis.timer; 此.currentDuration=0; this.previousDuration=0; 此参数为.marks=[]; 触发“更新”; 这个。触发“重置”; } 在事件上,回调{ var arr=this.listeners[event]; if!arr抛出“未知事件${event}”; arr.pushcallback; 归还这个; } msToTime持续时间{ 让毫秒数=parseIntduration%1000; 设秒数=Math.floorduration/1000%60; 分钟数=Math.floorduration/1000*60%60; 让小时数=数学总小时数/1000*60*60%24; 小时=hours.toString.padStart2,“0”; 分钟=分钟.toString.padStart2,'0'; 秒=秒.toString.padStart2,“0”; 毫秒=毫秒.toString.padStart3,“0”; 返回时间+:+分钟+:+秒+。+毫秒; } } const out=document.querySelectorout; const list=document.querySelectorlist; const myStopWatch=新秒表; myStopWatch .on'update',functiondata{ out.textContent=data.time; } .on'mark',functiondata{ var li=document.createElementli; li.textContent=data.marks.pop; 李斯特; }.在“重置”功能上{ list.innerHTML=; }; const wrapper=document.querySelectoractions; wrapper.addEventListenerclick,函数evt{ const action=evt.target.dataset.action; myStopWatch[行动]; }; 开始 停止 标记时间 重置

Dtime++;因为setTimeout不准确,所以它不是一种准确的时间跟踪方法。如果您等待的时间足够长,分钟数也会溢出到60分钟以上。@epascarello工作正常,您能解释一下它是如何不准确的吗?我已经检查了两个系统的计时是否准确。如果你离开页面,时钟暂停-我只是碰巧注意到。函数fixx{var y=x.toString.split'.';返回y[0]+.+y[1]| |.padEnd3,'0'}var x=Date.now;var时间=0;window.setInterval=>{time++;console.logfixtime/100,fixDate.now-x/1000},10;在控制台中运行此代码,离开选项卡,大约一分钟后返回。数字应该相等。。。。。但它们是吗?Dtime++;因为setTimeout不准确,所以它不是一种准确的时间跟踪方法。如果您等待的时间足够长,分钟数也会溢出到60分钟以上。@epascarello工作正常,您能解释一下它是如何不准确的吗?我已经检查了两个系统的计时是否准确。如果你离开页面,时钟暂停-我只是碰巧注意到。函数fixx{var y=x.toString.split'.';返回y[0]+.+y[1]| |.padEnd3,'0'}var x=Date.now;var时间=0;window.setInterval=>{time++;console.logfixtime/100,fixDate.now-x/1000},10;在控制台中运行此代码,离开选项卡,大约一分钟后返回。数字应该相等。。。。。但他们是吗?很好的编辑设置它只是在1小时以下的测试目的!我将使用var Dtime=10*0*3600+59*60+58;//设置为0小时、59分钟和58秒,以便测试更清晰。我把你的答案投了赞成票,正如你可能注意到的那样,我把它变成了一个片段。如果你离开页面,时钟就会暂停——我只是碰巧注意到了这一点。这不是对你的答案的反映,而是对op使用的实现的反映。你的答案很好。@iAmOren谢谢你的建议,但这感觉有点过分了。它仅用于测试目的,注释解释了它的含义。事实上,等式和注释的处理时间可能比仅仅一条注释要长。在生产代码中,这当然可能是一个不同的故事,因为它确实使更改更容易。@对于您的第二条评论,是的,这是依赖setTimeout/setInterval的缺点之一。这就是为什么我在回答的末尾添加了一个链接。嗨,谢谢你的回复,这解决了问题。我对计时器进行了测试,将使用它的精确性。感谢您的帮助编辑设置它只是在1个小时以下的测试目的!我将使用var Dtime=10*0*3600+59*60+58;//设置为0小时、59分钟和58秒,以便测试更清晰。我把你的答案投了赞成票,正如你可能注意到的那样,我把它变成了一个片段。如果你离开页面,时钟就会暂停——我只是碰巧注意到了这一点。这不是对你的答案的反映,而是对op使用的实现的反映。你的答案很好。@iAmOren谢谢你的建议,但这感觉有点过分了。它仅用于测试目的,注释解释了它的含义。事实上,等式和注释的处理时间可能比仅仅一条注释要长。在生产代码中,这当然可能是一个不同的故事,因为它确实使更改更容易。@对于您的第二条评论,是的,这是依赖setTimeout/setInterval的缺点之一。这就是为什么我在回答的末尾添加了一个链接。嗨,谢谢你的回复,这解决了问题。我对计时器进行了测试,将使用它的精确性。谢谢你的帮助。我更新了我的帖子,指出我故意提高了计时器的速度。太棒了!删除我的评论,投票支持你的答案。干杯,伙计:有了这段代码,我试着去理解它是如何工作的,这对我来说非常清楚。抱歉,我对JS很陌生,有一件事我似乎无法实现,我添加了一个开始/停止按钮,唯一的问题是如果我停止它,然后再次启动它,它将重置为00:00:00,我一直试图让它保存,但我想不出来?谢谢你的回答!那超出了你的要求。创建一个新的
问题是:但我会将每个递归updateTimer循环的differenceInMillis值存储在某个地方,比如outputElement.value或全局变量,然后从startTime=Date.now中减去该值。现在每当你重新启动计时器时。我更新了我的帖子,指出我故意提高了计时器的速度。太棒了!删除我的评论,投票支持你的答案。干杯,伙计:有了这段代码,我试着去理解它是如何工作的,这对我来说非常清楚。抱歉,我对JS很陌生,有一件事我似乎无法实现,我添加了一个开始/停止按钮,唯一的问题是如果我停止它,然后再次启动它,它将重置为00:00:00,我一直试图让它保存,但我想不出来?谢谢你的回答!那超出了你的要求。为此创建一个新问题:但我会将每个递归updateTimer循环的differenceInMillis值存储在outputElement.value或全局变量之类的位置,然后在重新启动计时器时从startTime=Date.now中减去该值。