轻松解决JavaScript定时器越走越快的问题


Posted in Javascript onMay 13, 2019

解决JavaScript定时器越走越快的问题

之前在项目中写了定时器来做循环播放,但是总是会有越走越快的问题,开始是以为前后的HTML代码拼接的有问题,时间紧急的情况下反复改了很多也没什么效果,后来发现是js定时器的问题,在这里记录一下。

(setinterval)多次初始化

使用js定时器(setinterval)首要的问题就是要记得清除,即调用(clearInterval)方法,由于没有使用定时器的经验,我一开始是没有清除定时器,程序每一次初始化的时候都调用一次定时器,之前的定时器实例没有被销毁,新的定时器又开始执行,就会出现1s变0.5s,0.5s变0.25秒的情况,从观感上来看就是定时器“越走越快”了。

这个过程可以用几行简单的代码模拟一下

<label id="lblShowNum"></label>
<input type="button" id="btnStart" value="启动" />
<input type="button" id="btnClear" value="清除" />
window.onload = function () {
  var i = 0;
  var timer;
  document.getElementById("btnStart").onclick = function () {    
    timer = setInterval(
      function () {
        i++;
        document.getElementById("lblShowNum").innerText = i;
      }, 1000);
  }
  document.getElementById("btnClear").onclick = function () {
    clearInterval(timer);
  }
}

如果只点击一次“启动”按钮,定时器会正常运行,点击“清除”按钮就可以暂停定时器,但是每一次点击“启动”按钮,都会提高数字的增速,而清除功能也不再起作用,这就是因为在每一次点击“启动”的时候都有新的定时器被创建。

清除(clearInterval)的失效

但为什么清除的方法会失效呢?在代码中我们定义了一个变量timer去接收定时器,对timer操作是不是就能清除定时器了呢?并不是是这样,首先看下setinterval()返回值的说明

一个可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。

这里可以看出这个返回值并不是定时器本身,它只是一个用于传递的返回值,如果想当然的把它当做定时器,以为每次初始化赋值就是新的定时器就错了,我最开始就是这样想的。

每一次给timer赋值都是在创建新的定时器对象,而且之前的定时器也并没有被清除,所以这时候调用clearInterval(timer)清除的只是最后一个被创建的定时器对象罢了。

使用上面的例子就可以简单的用肉眼观察效果,先点击一次启动观察速度,再点击第二次,会看到速度有明显的提升,这时候使用清除功能,速度就会回到第一次启动的状态,但是多次点击清除是没有用的,如果想看准确的结果可以将时间打印出来进行比较。

解决方法

看到这里,答案呼之欲出了,很简单,在每次初始化定时器之前先执行清除操作,保证之前的定时器被清除了就不会发生越走越快的情况,所以其实并不是定时器越走越快,而是有多个定时器在执行,定时器里面的程序执行的频率提高了。

window.onload = function () {
  var i = 0;
  var timer;
  document.getElementById("btnStart").onclick = function () {    
    clearInterval(timer); 
    timer = setInterval(
      function () {
        i++;
        document.getElementById("lblShowNum").innerText = i;
      }, 1000);
  }
  document.getElementById("btnClear").onclick = function () {
    clearInterval(timer);
  }
}

总结

以上所述是小编给大家介绍的轻松解决JavaScript定时器越走越快的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
从零开始学习jQuery (六) jquery中的AJAX使用
Feb 23 Javascript
容易被忽略的JS脚本特性
Sep 13 Javascript
jquery二级导航内容均分的原理及实现
Aug 13 Javascript
Javascript中this的用法详解
Sep 22 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
jquery实现在光标位置插入内容的方法
Feb 05 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
jQuery+Ajax实现限制查询间隔的方法
Jun 07 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
Mar 06 Javascript
你或许不知道的一些npm实用技巧
Jul 04 Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 Javascript
JavaScript Math对象和调试程序的方法分析
May 13 #Javascript
jsonp跨域获取百度联想词的方法分析
May 13 #Javascript
基于Fixed定位的框选功能的实现代码
May 13 #Javascript
JQuery事件委托原理与用法实例分析
May 13 #jQuery
使用原生js编写一个简单的框选功能方法
May 13 #Javascript
Node.js实现一个HTTP服务器的方法示例
May 13 #Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
May 13 #jQuery
You might like
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
Javascript - HTML的request类
2007/01/09 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
python求最大连续子数组的和
2018/07/07 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
python绘制直方图和密度图的实例
2019/07/08 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
经典大学生求职信范文
2014/01/06 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
六一儿童节主持词
2014/03/21 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
党支部三会一课计划
2014/09/24 职场文书
教师批评与自我批评
2014/10/15 职场文书
售后服务承诺函格式
2015/01/21 职场文书
奖学金个人总结
2015/03/04 职场文书
演讲开场白台词大全
2015/05/29 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python