如何在秒表中显示毫秒?

Zip*_*Zip 1 javascript stopwatch

我正在使用Javascript实现秒表。我有基本的html文档设置和一个名为stopwatch.js的javascript文件,其中有以下代码。我利用函数每隔1秒(1000毫秒)setInterval执行clockRunning一次函数。这使我可以控制秒,分钟和小时来相应地增加它们,但是我很难在秒表中插入毫秒。如何将毫秒从0递增到1000,然后重置为零?

我已经通过减小间隔时间试图setInterval要调用的函数每1ms,然后设置millisecond变量time%1000,其中time变量是每个函数被调用时增加1。但这并没有给出我想要的结果。在millisecond似乎过于缓慢增加的方式。

var running = 0
var time = 0;
var hour = 0;
var min = 0;
var sec = 0;
var millisec = 0;


function start(){
	started = window.setInterval(clockRunning, 1000);	
}

function stop(){
	window.clearInterval(started);
}

function clockRunning(){
	time++;
	sec++;
	if (sec == 60){
		min += 1;
		sec = 0;
	if (min == 60){
		hour += 1;
		min = 0;
	}
	
	
	}

	document.getElementById("display-area").innerHTML = (hour ? (hour > 9 ? hour : "0" + hour) : "00") 
	+ ":" + (min ? (min > 9 ? min : "0" + min) : "00") + ":" + (sec > 9 ? sec : "0" 
		+ sec);
};
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Stopwatch</title>
        <script src="stopwatch.js"></script>
        <style>
            #display-area { font-size: 20pt; }
        </style>

    </head>
    <body>
        <div>
            <output id="display-area">00:00:00.000</output>
        </div>
        <div>
            <button id="toggle-button" onClick="start()">Start</button>
            <button id="toggle-button" onClick="stop()">Stop</button>
            <button id="reset-button">Reset</button>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

And*_*ker 6

您应该跟踪开始时间,然后使用Date:从当前时间减去该时间:

var timeBegan = null
    , timeStopped = null
    , stoppedDuration = 0
    , started = null;

function start() {
    if (timeBegan === null) {
        timeBegan = new Date();
    }

    if (timeStopped !== null) {
        stoppedDuration += (new Date() - timeStopped);
    }
    console.log(stoppedDuration);

    started = setInterval(clockRunning, 10);	
}

function stop() {
    timeStopped = new Date();
    clearInterval(started);
}
 
function reset() {
    clearInterval(started);
    stoppedDuration = 0;
    timeBegan = null;
    timeStopped = null;
    document.getElementById("display-area").innerHTML = "00:00:00.000";
}

function clockRunning(){
    var currentTime = new Date()
        , timeElapsed = new Date(currentTime - timeBegan - stoppedDuration)
        , hour = timeElapsed.getUTCHours()
        , min = timeElapsed.getUTCMinutes()
        , sec = timeElapsed.getUTCSeconds()
        , ms = timeElapsed.getUTCMilliseconds();

    document.getElementById("display-area").innerHTML = 
        (hour > 9 ? hour : "0" + hour) + ":" + 
        (min > 9 ? min : "0" + min) + ":" + 
        (sec > 9 ? sec : "0" + sec) + "." + 
        (ms > 99 ? ms : ms > 9 ? "0" + ms : "00" + ms);
};
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Stopwatch</title>
        <style>
            #display-area { font-size: 20pt; }
        </style>

    </head>
    <body>
        <div>
            <output id="display-area">00:00:00.000</output>
        </div>
        <div>
            <button id="toggle-button" onClick="start()">Start</button>
            <button id="toggle-button" onClick="stop()">Stop</button>
            <button id="reset-button" onClick="reset()">Reset</button>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

之前看到毫秒“滞后”的原因setInterval是众所周知的,因为您没有在指定时精确触发。您可以使用上述策略解决此问题。

更新:您可以跟踪两次重置之间计时器“暂停”了多长时间。更新了我的答案以适应这一点。