轻松解决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 相关文章推荐
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
Oct 17 Javascript
lyhucSelect基于Jquery的Select数据联动插件
Mar 29 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
Mar 01 Javascript
JavaScript中String.prototype用法实例
May 20 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
[js高手之路]单例模式实现模态框的示例
Sep 01 Javascript
js实现简单数字变动效果
Nov 06 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
Vue性能优化的方法
Jul 30 Javascript
vue判断按钮是否可以点击
Apr 09 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python魔法方法详解
2019/02/13 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
python3 map函数和filter函数详解
2019/08/26 Python
python学习笔记之多进程
2020/08/06 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
HTML5有哪些新特征
2015/12/01 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
企业演讲稿范文
2013/12/28 职场文书
财经学院自荐信范文
2014/02/02 职场文书
电教室标语
2014/06/20 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
运动会5000米加油稿
2015/07/21 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书