
本文旨在解决JavaScript中使用`setTimeout`实现的计时器逐渐变慢的问题。我们将分析问题的根源,并提供一种基于系统时间的解决方案,确保计时器的准确性和稳定性。通过修改代码,利用`Date`对象获取当前时间,计算时间差,并使用`requestAnimationFrame`优化动画效果,可以创建一个更精确的计时器。
使用setTimeout函数在JavaScript中创建计时器是一种常见的方法。然而,这种方法存在一个固有的问题:setTimeout的回调函数并非在指定的时间间隔后立即执行。它会被放入事件队列,等待主线程空闲时才执行。
这意味着,如果主线程繁忙(例如,执行复杂的计算或渲染),回调函数的执行时间可能会延迟。随着时间的推移,这些延迟会累积,导致计时器逐渐变慢。每次更新HTML元素也会消耗时间,进一步加剧这个问题。
为了解决setTimeout的局限性,我们可以使用系统时间来计算经过的时间,而不是依赖setTimeout的精确度。这种方法的核心思想是:
立即学习“Java免费学习笔记(深入)”;
以下是修改后的JavaScript代码:
var hr = 0;
var min = 0;
var sec = 0;
var count = 0;
var Startbutton = document.getElementById("Start");
var timer = false;
var start_time;
function start() {
Startbutton.disabled = true;
timer = true;
start_time = (new Date()).getTime(); // 记录起始时间
stopwatch();
}
function stop() {
timer = false;
start_time = null;
Startbutton.disabled = false;
}
function reset() {
timer = false;
start_time = null;
Startbutton.disabled = false;
min = 0;
hr = 0;
sec = 0;
count = 0;
document.getElementById("hr").innerHTML = "00";
document.getElementById("min").innerHTML = "00";
document.getElementById("sec").innerHTML = "00";
document.getElementById("count").innerHTML = "00";
}
function stopwatch() {
var now = (new Date()).getTime(); // 获取当前时间
var diff = now - start_time; // 计算时间差
if (timer) {
var str_time = (new Date(diff).toISOString().slice(11, 23)); // 将时间差转换为HH:MM:SS.MS格式
var hrString = "" + str_time.substring(0, 2);
var minString = "" + str_time.substring(3, 5);
var secString = "" + str_time.substring(6, 8);
var countString = "" + str_time.substring(9, 11);
document.getElementById("hr").innerHTML = hrString;
document.getElementById("min").innerHTML = minString;
document.getElementById("sec").innerHTML = secString;
document.getElementById("count").innerHTML = countString;
requestAnimationFrame(stopwatch); // 使用requestAnimationFrame
}
}代码解释:
HTML代码(保持不变):
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Stopwatch</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div id="container">
<div id="time">
<span class="digit" id="hr">00</span>
<span class="txt">Hr</span>
<span class="digit" id="min">00</span>
<span class="txt">Min</span>
<span class="digit" id="sec">00</span>
<span class="txt">Sec</span>
<span class="digit" id="count">00</span>
</div>
<div id="btn-container">
<button class="btn" id="Start" onclick="start()">Start</button>
<button class="btn" id="Stop" onclick="stop()">Stop</button>
<button class="btn" id="Reset" onclick="reset()">Reset</button>
</div>
</div>
<script src="script.js"></script>
</body>
</html>通过使用系统时间计算时间差,并结合requestAnimationFrame函数,我们可以创建一个更精确、更稳定的JavaScript计时器。这种方法避免了setTimeout的局限性,确保计时器能够准确地反映经过的时间。在实际应用中,可以根据需要调整代码,例如,可以添加暂停功能,或者将计时器显示为不同的格式。
以上就是解决JavaScript计时器变慢的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号