javascript - setInterval计数器问题

标签 javascript setinterval

我有这个小脚本。我的问题是,当我单击“开始”按钮时,计数会正常开始,但如果我再次单击它,计数器就会开始表现得很奇怪。如何避免此问题并在每次单击按钮时启动一个新的计数器?

$(".c1").click(function(e){
let a = 0;
setInterval(function(){ $("#timer").text(a);  a++; }, 500);

})
.card{ font-size:25px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">


<div class="btn c1"> Start Timer</div>
<br>

<br>
<span id="timer"  class="card">0</span>

最佳答案

“表现得很奇怪”是因为您正在启动一个第二个单独的计时器,所以现在两个计时器都在运行,每个计时器都将自己的a副本放入元素中。您需要记住前一个计时器的句柄(setInterval 的返回值)并取消它(通过clearInterval):

let handle = 0;
$(".c1").click(function(e) {
  let a = 0;
  clearInterval(handle)
  handle = setInterval(function() {
    $("#timer").text(a);
    a++;
  }, 500);

})
.card {
  font-size: 25px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">


<div class="btn c1"> Start Timer</div>
<br>

<br>
<span id="timer" class="card">0</span>

注意,我使用值0作为handle的初始值,然后我很高兴地调用clearInterval无论计时器是否是否已经运行。 0 是无效的句柄值,并且 clearInterval(和 clearTimeout)会忽略无效的句柄值,因此您可以安全地执行此操作。但如果您愿意,请添加 if

关于javascript - setInterval计数器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52790680/

相关文章:

javascript - 当 setInterval() 运行另一个函数时,一个有效的函数突然变为 "not a function"

javascript - 渲染和删除多个 View ...

javascript - 尝试实现特定于 Django 模型属性的“阅读更多”按钮

node.js - 在单个进程中排队 javascript 代码

javascript - 如何每次使用随机毫秒数的setInterval?

javascript倒计时器,点击事件后间隔加快

javascript - 如何让这个 Carousel Slider 自动滑动?

javascript - Html服务 : Passing array from google sheet to html service and passing form array back error

javascript - 在异步 google.script.run 成功时递增 while 循环

javascript - 关于从 reducer 函数返回 bool 值的问题