轻松解决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静态的动态
Sep 18 Javascript
csdn 博客中实现运行代码功能实现
Aug 29 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
Javascript学习笔记 delete运算符
Sep 13 Javascript
jQuery中die()方法用法实例
Jan 19 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
Apr 28 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
javascript中的深复制详解及实例分析
Dec 29 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
Jul 22 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
php生出随机字符串
2017/07/06 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书