6

我有一个简单的 JavaScript 计时码表,它显示在名为“d2”的表单字段上,它用于检查某人执行特定任务的时间:

var milisec=0 
var seconds=0
var complemento1=""
document.form1.d2.value='00:00:00' 

function display(){ 
    if (milisec>=9){ 
        milisec=0 
        seconds+=1 
    } 
    else{
        milisec+=1
    }
    complemento1=complemento2=complemento3="";
    if ((seconds%60)<10) complemento1="0";
    if ((Math.floor(seconds/60)%60)<10) complemento2="0";
    if ((Math.floor(seconds/3600))<10) complemento3="0";
    document.form1.d2.value=complemento3+Math.floor(seconds/3600)+":"+complemento2+(Math.floor(seconds/60)%60)+":"+complemento1+(seconds%60)
    setTimeout("display()",100) 
}

问题是当这个人打开一个新标签/使用另一个程序时,计时器会停止,然后在窗口再次聚焦时恢复(使用 Chrome)。它有最奇怪的行为,因为有时它起作用,有时它不起作用。

我看到很多帖子需要脚本在不集中时停止,我想要完全相反,搜索了一个多小时没有运气。非常感谢您的帮助!

4

1 回答 1

3

JavaScript 超时不保证在特定时间执行。例如,如果在定时器结束时线程正忙于其他事情,它将首先完成它正在做的事情,然后执行你的定时器。

此外,您的函数没有考虑在 display 函数中花费的时间,因此每毫秒都会增加一点延迟。

实现定时器的正确方法是使用系统时间。

所以像:

//Call at the beggining to save the start time
var start_time = new Date()

// Compute seconds (does not matter when/how often you call it.) 
var milliseconds_since_start = new Date().valueOf() - start_time 

Date 对象还可以将此期间格式化为您的时钟:

var m  = new Date(milliseconds_since_start)
m.getMinutes()+":"+m.getSeconds()
于 2015-01-17T14:26:10.830 回答