轻松解决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 相关文章推荐
将json当数据库一样操作的javascript lib
Oct 28 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
Oct 28 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
深入解析JavaScript中函数的Currying柯里化
Mar 19 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
浅析JavaScript中的array数组类型系统
Jul 18 Javascript
JS简单实现表格排序功能示例
Dec 20 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
Jan 14 Javascript
vue使用原生swiper代码实例
Feb 05 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
安装APACHE
2007/01/15 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
初识PHP
2014/09/28 PHP
yii分页组件用法实例分析
2015/12/28 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
js正确获取元素样式详解
2009/08/07 Javascript
css配合jquery美化 select
2013/11/29 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
js里面的变量范围分享
2020/07/18 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
python进行两个表格对比的方法
2018/06/27 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
python缩进长度是否统一
2020/08/02 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
华三通信H3C面试题
2015/05/15 面试题
家长会学生家长演讲稿
2013/12/29 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
总经理司机岗位职责
2015/04/10 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
张丽莉观后感
2015/06/16 职场文书