轻松解决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常用正则表达式汇总
Jul 31 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
Dec 04 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
Mar 22 Javascript
javascript iframe跨域详解
Oct 26 Javascript
微信小程序自定义组件
Aug 16 Javascript
Js利用Canvas实现图片压缩功能
Sep 13 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
JS二级菜单不同实现方法分析【4种方法】
Dec 21 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
Apr 16 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
详解Javascript实践中的命令模式
May 05 Javascript
浅谈Vue的computed计算属性
Mar 21 Vue.js
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 set_error_handler()函数使用详解(示例)
2013/11/12 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[01:13]这,就是刀塔
2014/07/16 DOTA
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
值得收藏的10道python 面试题
2019/04/15 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
如何基于python操作excel并获取内容
2019/12/24 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
公务员年总结的自我评价
2013/10/25 职场文书
高一生物教学反思
2014/01/17 职场文书
融资租赁计划书
2014/04/29 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
创文明城市标语
2014/06/16 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python