轻松解决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 相关文章推荐
JavaScript中void(0)的具体含义解释
Feb 27 Javascript
javascript显示隐藏层比较不错的方法分析
Sep 30 Javascript
javascript 动态修改样式和层叠样式表代码
Apr 27 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
javascript DOM的详解及实例代码
Mar 06 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
vue项目优化之通过keep-alive数据缓存的方法
Dec 11 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
Sep 12 Javascript
使用uni-app开发微信小程序的实现
Dec 13 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
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP中soap的用法实例
2014/10/24 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
用python实现对比两张图片的不同
2018/02/05 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
班级德育工作实施方案
2014/02/21 职场文书
大课间活动实施方案
2014/03/06 职场文书
自我鉴定总结
2014/03/24 职场文书
捐助倡议书范文
2014/04/15 职场文书
小学六年级学生评语
2014/04/22 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
好员工观后感
2015/06/17 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技