问题描述:
当我们调用setInterval函数时会发现,它会导致计时越来越快的问题。
解决方法:
点击开始按钮,参数变为真,计时器才会改变,有效避免了反复调用setInterval函数,从而有效避免了setInterval()引发的加速效果。
效果截图:
实现代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>简易计时器</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
input{
margin-top: 20px;
width: 283px;
height: 40px;
border-radius: 3px;
text-align: center;
font-size: 25px;
line-height: 40px;
}
button{
margin-top: 8px;
width: 90px;
height: 40px;
font-size: 25px;
line-height: 40px;
}
</style>
</head>
<body>
<div><input type="text" id="timer" value="0s"></div>
<button onclick="begin()">开始</button>
<button onclick="stop()">停止</button>
<button onclick="cleartime()">清零</button>
</body>
<script type="text/javascript">
a=0;
index=false;
sobj=setInterval(function(){
if(index){
time=++a;
document.getElementById('timer').value=time+"s";
}
},1000);
//点击开始按钮,index变为真,计时器才会改变,有效避免了反复调用setInterval函数
function begin(){
index=true;
}
function stop(){
index=false;
}
function cleartime(){
index=false;
time=0;
a=0;
document.getElementById('timer').value=time+"s";
return index;
}
</script>
</html>
2023.7.14更新:
setInterval越来越快的原因
setInterval越来越快的原因是由于JavaScript的事件循环机制导致的。
在JavaScript中,事件循环是一种机制,用于处理异步操作和事件。事件循环会不断地从任务队列中取出任务并执行,然后再继续下一个任务。当使用setInterval创建定时器时,定时器会在指定的时间间隔之后将任务添加到任务队列中。
然而,如果任务队列中的任务没有立即执行完毕,而是需要一些时间才能完成,那么下一个任务就会被推迟。当定时器的时间间隔小于任务执行的时间时,下一个定时器任务会在上一个任务执行完之前被添加到任务队列中。这样就会导致定时器任务的执行频率加快,从而出现"越来越快"的情况。
举个例子,假设你设置了一个间隔为100毫秒的setInterval定时器,并且定时器的任务需要花费200毫秒才能完成。在这种情况下,下一个定时器任务将会在上一个任务执行完之前的100毫秒内被添加到任务队列,因此定时器任务的执行间隔会逐渐减少。
为了避免这种情况,你可以使用setTimeout来替代setInterval,并在每次任务执行完后手动设置下一个定时器,以确保任务之间有固定的时间间隔。
新的解决方法
let intervalId = setInterval(myFunction, 1000); // 设置初始定时器
function myFunction() {
// 在这里执行你的代码逻辑
clearInterval(intervalId); // 清除之前的定时器
intervalId = setInterval(myFunction, 1000); // 设置新的定时器
}
发布者:admin,转转请注明出处:http://www.yc00.com/web/1754941595a5218236.html
评论列表(0条)