setInterval多次点击后无法停止

单次点击开始时钟,程序正常运行,点击停止时钟,时钟立刻停止;多次点击开始时钟后,程序运行,点击停止时钟,程序有响应,但是时钟未停止。请问这是什么情况?

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<p>页面上显示时钟:</p>
<p id="demo"></p>
<button id='myStopFunction'>停止时钟</button>
<button onclick="mvToLft()">开始时钟</button>
<script>
function mvToLft(){
    var myVar=setInterval(function(){myTimer()},1000);
    document.getElementById('myStopFunction').onclick = function(){
        clearInterval(myVar);
        console.log(1);
    };
}
function myTimer(){
    console.log(0);
    var d=new Date();
    var t=d.toLocaleTimeString();
    document.getElementById("demo").innerHTML=t;
}
</script>
</body>
</html>
阅读 7.4k
5 个回答

// 你写的 代码太萌, 看看这符合要求吗, 建议 看一下 函数 闭包 和 setInterval (返回的是 数字id),
多次执行 开始 setInterval 会多次调用, 造成 myVar 只保留最后一次 setInterval 返回的id, 最终造成调用clear函数,只清楚除最后一次。
然而还有其他执行的 setInterval 队列。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<p>页面上显示时钟:</p>
<p id="demo"></p>
<button id='myStopFunction'>停止时钟</button>
<button onclick="mvToLft()">开始时钟</button>
<script>
var myVar = null
function mvToLft(){
    myVar !== null && clearInterval(myVar)
    myVar = setInterval(function(){myTimer()},1000);
    document.getElementById('myStopFunction').onclick = function(){
        clearInterval(myVar);
    };
}
function myTimer(){
    console.log(0);
    var d=new Date();
    var t=d.toLocaleTimeString();
    document.getElementById("demo").innerHTML=t;
}
</script>
</body>
</html>

你点一次,开始一个时钟,点两次,又加一个,最后,你停止的时候,只把最后一个给停了,其他的还在进行中

多次点击开始时钟后,就往队列里面放入了多个定时任务,
一次点击停止时钟,对应一个任务,其他回调还是会在满足时间间隔后继续执行

怎么不使用settimeOut呢?

点击开始时钟的时候,你得先清掉已开的定时器啊,不然你多个定时器同时跑,当然会有问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进