首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何暂停setInterval()函数?

如何暂停setInterval()函数?
EN

Stack Overflow用户
提问于 2014-01-22 08:36:34
回答 8查看 152.9K关注 0票数 85

如何使用Javascript暂停并恢复setInterval()函数?

例如,也许我有一个秒表告诉你,你一直在看网页的秒数。有一个“暂停”和“简历”按钮。clearInterval()不能在这里工作的原因是,如果用户在第40秒和800毫秒处单击“暂停”按钮,当他单击“简历”按钮时,经过的秒数必须在200毫秒后增加1。如果我在计时器变量上使用clearInterval()函数(当单击暂停按钮时),然后再次对计时器变量使用setInterval()函数(当单击恢复按钮时),经过的秒数在1000毫秒后才会增加1,这就破坏了秒表的准确性。

那我该怎么做?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-01-22 08:42:28

您可以使用一个标志来跟踪状态:

代码语言:javascript
运行
复制
var output = $('h1');
var isPaused = false;
var time = 0;
var t = window.setInterval(function() {
  if(!isPaused) {
    time++;
    output.text("Seconds: " + time);
  }
}, 1000);

//with jquery
$('.pause').on('click', function(e) {
  e.preventDefault();
  isPaused = true;
});

$('.play').on('click', function(e) {
  e.preventDefault();
  isPaused = false;
});
代码语言:javascript
运行
复制
h1 {
    font-family: Helvetica, Verdana, sans-serif;
    font-size: 12px;
}
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1>Seconds: 0</h1>
<button class="play">Play</button>
<button class="pause">Pause</button>

这正是我要做的,我不确定你是否真的可以暂停setInterval。

注意:这个系统很简单,对于不需要很高精度的应用程序也很好,但是它不会考虑在滴答之间经过的时间:如果您在半秒钟后单击“暂停”,然后单击“播放”,那么您的时间将缩短半秒。

票数 141
EN

Stack Overflow用户

发布于 2014-01-22 08:45:33

你不应该用区间函数来测量时间。相反,只需在计时器启动时节省时间,并在计时器停止/暂停时测量差异。仅使用setInterval更新显示的值。因此,没有必要暂停计时器,您将获得最佳的准确性,以这种方式。

票数 17
EN

Stack Overflow用户

发布于 2017-03-30 23:19:58

@Jonas Giuro说得对:

不能暂停setInterval函数,可以停止它(clearInterval),或者让它运行

另一方面,这种行为可以用suggested @VitaliyG建议来模拟。

你不应该用区间函数来测量时间。相反,只需在计时器启动时节省时间,并在计时器停止/暂停时测量差异。仅使用setInterval更新显示的值。

代码语言:javascript
运行
复制
var output = $('h1');
var isPaused = false;
var time = new Date();
var offset = 0;
var t = window.setInterval(function() {
  if(!isPaused) {
    var milisec = offset + (new Date()).getTime() - time.getTime();
    output.text(parseInt(milisec / 1000) + "s " + (milisec % 1000));
  }
}, 10);

//with jquery
$('.toggle').on('click', function(e) {
  e.preventDefault();
  isPaused = !isPaused;
  if (isPaused) {
    offset += (new Date()).getTime() - time.getTime();
  } else {
    time = new Date();
  }

});
代码语言:javascript
运行
复制
h1 {
    font-family: Helvetica, Verdana, sans-serif;
    font-size: 12px;
}
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1>Seconds: 0</h1>
<button class="toggle">Toggle</button>

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21277900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档