我认为如果你想要在毫秒方面接近准确的东西,你应该使用 .performance.now() 。
以为你有一个有趣的问题,所以我想出了一个我自己的解决方案来取乐。希望能帮助到你。:)(代码下方的更新)
http://jsfiddle.net/colbycallahan/CjDz7/1/(为了显示和四舍五入清理了一下)
工作并需要 jQuery:
HTML:
<div id="console"></div>
<input type="button" id="btn" value="start time">
<input type="button" id="btn2" value="stop time">
js:
var timerRunning = false;
var startTime;
var totalTime;
$('#console').data('totalTime', 0);
function startTimer(){
totalTime = $('#console').data('totalTime');
startTime = window.performance.now();
timerRunning = true;
function timerLoop(){
window.setTimeout(function(){
if(timerRunning){
$('#console').text(window.performance.now() - startTime + totalTime);
timerLoop();
}
}, 50);
}
timerLoop();
}
$('#btn').on('click', function(){
startTimer();
});
$('#btn2').on('click', function(){
totalTime = window.performance.now() - startTime + totalTime;
$('#console').data('totalTime', totalTime);
timerRunning = false;
});
我拿走了你的代码,我做的第一件事是修复可能导致语法错误的问题,即与 if 语句分开的行上的花括号、运行状态为 0 时 if 语句中缺少分号、一个分号错误地放置在时间计数器中() 称呼。您尝试通过将函数设为字符串来调用函数,但字符串从不调用函数。在将它作为参数传递给 timecounter() 之前未定义 starttime。您的 settimeout() 行应设置在条件语句之外以调用它。如果运行状态不是 1,则不必要地调用 else。除了将其设为空字符串外,未定义 lapdate。除非运行状态为 1,否则不定义刷新,但仅在刷新不等于 1 时调用。最后,您没有包含所有必要的代码来了解是否犯了其他错误,也没有足够的代码来知道我重写的内容是否可以解决您的问题,这就是我编写新代码的原因(它需要将 jquery 库包含在您的页)。我真的不明白你的代码的逻辑。还有一件事:您需要在用户启动计时器、单击暂停然后恢复计时器后检索经过时间的存储值。作为感谢,您应该访问 JSLint.com 或类似网站,并且在通过 lint 测试之前不要在浏览器中运行您的代码。我只是在底部重新发布您的代码,并且不希望它起作用。我在 vanilla javascript 中重做了我的计时器,不需要 jquery。是这里:这就是我编写新代码的原因(它需要在您的页面中包含 jquery 库)。我真的不明白你的代码的逻辑。还有一件事:您需要在用户启动计时器、单击暂停然后恢复计时器后检索经过时间的存储值。作为感谢,您应该访问 JSLint.com 或类似网站,并且在通过 lint 测试之前不要在浏览器中运行您的代码。我只是在底部重新发布您的代码,并且不希望它起作用。我在 vanilla javascript 中重做了我的计时器,不需要 jquery。是这里:这就是我编写新代码的原因(它需要在您的页面中包含 jquery 库)。我真的不明白你的代码的逻辑。还有一件事:您需要在用户启动计时器、单击暂停然后恢复计时器后检索经过时间的存储值。作为感谢,您应该访问 JSLint.com 或类似网站,并且在通过 lint 测试之前不要在浏览器中运行您的代码。我只是在底部重新发布您的代码,并且不希望它起作用。我在 vanilla javascript 中重做了我的计时器,不需要 jquery。是这里:com 或类似的,并且永远不要在浏览器中运行您的代码,直到它通过 lint 测试。我只是在底部重新发布您的代码,并且不希望它起作用。我在 vanilla javascript 中重做了我的计时器,不需要 jquery。是这里:com 或类似的,并且永远不要在浏览器中运行您的代码,直到它通过 lint 测试。我只是在底部重新发布您的代码,并且不希望它起作用。我在 vanilla javascript 中重做了我的计时器,不需要 jquery。是这里:
工作并且不需要 jQuery:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="console"></div>
<input type="button" id="btn" value="start time" onclick="startTimer();">
<input type="button" id="btn2" value="stop time" onclick="stopTimer();">
<input type="hidden" id="storedTime" value="0">
<script>
var timerRunning = false;
var startTime;
var totalTime;
var storedTimeInp = document.getElementById('storedTime');
var console = document.getElementById('console');
function startTimer(){
totalTime = Number(storedTimeInp.value, 10);
startTime = window.performance.now();
timerRunning = true;
function timerLoop(){
window.setTimeout(function(){
if(timerRunning){
console.innerHTML = (window.performance.now() - startTime + totalTime);
timerLoop();
}
}, 50);
}
timerLoop();
}
function stopTimer(){
totalTime = window.performance.now() - startTime + totalTime;
storedTimeInp.value = totalTime;
timerRunning = false;
}
</script>
</body>
</html>
你的代码重写有点(坏):
var runningstate = 0;
function timecounter(starttime){
currentdate = new Date();
details = document.getElementById('details');
stopwatch = document.getElementById('stopwatch');
var timediff = currentdate.getTime() - starttime;
setTimeout(
if(runningstate == 0){
timediff = timediff + stoptime;
}else{
stopwatch.value = formattedtime(timediff);
timecounter(starttime);
stoptime = timediff;
}
,10);
}
function startandstop(){
var startandstop = document.getElementById('startandstopbutton');
if(runningstate==0){
startandstop.value = 'Pause';
runningstate = 1;
starttime = new Date();
starttime = starttime.getTime();
timecounter(starttime);
}else{
startandstop.value = 'Start';
runningstate = 0;
lapdate = '';
}
}