轻松解决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 操作DOM案例代码分享
Apr 05 Javascript
JS实现的省份级联实例代码
Jun 24 Javascript
简单几行JS Code实现IE邮件转发新浪微博
Jul 03 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
Oct 05 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
jQuery实现列表的增加和删除功能
Jun 14 jQuery
vue项目打包部署_nginx代理访问方法详解
Sep 20 Javascript
微信小程序开发问题之wx.previewImage
Dec 25 Javascript
vue实现鼠标移过出现下拉二级菜单功能
Dec 12 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 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
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
php反射应用示例
2014/02/25 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
js的写法基础分析
2011/01/17 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
特色冷饮店创业计划书
2014/01/28 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
单位婚育证明范本
2014/11/21 职场文书
村干部任职承诺书
2015/01/21 职场文书
小学数学国培研修日志
2015/11/13 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
Python绘制分类图的方法
2021/04/20 Python
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android