轻松解决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 相关文章推荐
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
Javascript弹出窗口的各种方法总结
Nov 11 Javascript
js取消单选按钮选中示例代码
Nov 14 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
jQuery实现区域打印功能代码详解
Jun 17 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
inner join 内联与left join 左联的实例代码
Sep 18 Javascript
微信小程序实现收藏与取消收藏切换图片功能
Aug 03 Javascript
React中使用async validator进行表单验证的实例代码
Aug 17 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
Apr 04 Javascript
JS监听Esc 键触发事键
Apr 14 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python求列表交集的方法汇总
2014/11/10 Python
Django多数据库的实现过程详解
2019/08/01 Python
python 基于opencv实现图像增强
2020/12/23 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
幼儿园食品安全责任书
2015/05/08 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
JavaScript实现栈结构详细过程
2021/12/06 Javascript