var rightTimmer;
var leftTimmer;
document.getElementById("left").onclick = function(){
leftTimmer = setInterval("goleft()",5);
function goleft() {
var container = document.getElementById("container");
if (container.scrollLeft === 3240) {
container.scrollLeft = 0;
console.log(container.scrollLeft);
container.scrollLeft += 5;
if (container.scrollLeft === 3240) {
container.scrollLeft = 0;
for (var i = 1; i<=leftTimmer; i++){//用for循环清除页面所有定时器
clearInterval(i);
// clearInterval(leftTimmer);
console.log(container.scrollLeft);
} else if (container.scrollLeft % 810 === 0) {
for (var i = 1; i<=leftTimmer; i++){
clearInterval(i);
// clearInterval(leftTimmer);
console.log(container.scrollLeft);
在图片轮播中点击下一张图片按钮,setinterval定时器多次初始化,导致清除失效在使用定时器做图片轮播时,连续两次点击下一张图形会越走越快,清除定时器失效<div class="out"> <div id="container"> <a href="#" id="left" onclick="goRightTimmer()"><</a> <a href="#" id="right" oncl
使用场景:我在函数A中调用定时器函数,定时器是单独写的一个函数
原因:页面加载时我调用了1次函数A,然后又单独调用了一次定时器函数,导致调用了2次setInterval(),导致有setInterval_id有2个值。
通过打印定时器的值发现的问题。
clearInterval()只关闭了其中一个setInterval_id,另一个setInterval_id还会启动setInterval()。
解决方法:把单独调用的定时器函数去掉。
补充知识:js vue中setTimeout无法通过clearTimeout清除问题
在异步清除中,利用vue 中data存放setTimeout的标识进行清除
解决JavaScript定时器越走越快的问题
之前在项目中写了定时器来做循环播放,但是总是会有越走越快的问题,开始是以为前后的HTML代码拼接的有问题,时间紧急的情况下反复改了很多也没什么效果,后来发现是js定时器的问题,在这里记录一下。
(setinterval)多次初始化
使用js定时器(setinterval)首要的问题就是要记得清除,即调用(clearInterval)方法,由于没有使用定时器的经验,我一开始是没有清除定时器,程序每一次初始化的时候都调用一次定时器,之前的定时器实例没有被销毁,新的定时器又开始执行,就会出现1s变0.5s,0.5s变0.25秒的情况,从观感上来看就是定时
function do(){
//clearInterval要放在方法开始,不然的话,下面的代码还没运行到clearInterval,又开始了循环了。
clearInterval(timer)
//do something...
19.js定时器,以及解释、解决多次点击/触发定时器越走越快——软设问题总结19.1 js定时器19.2 定时器的使用19.3 定时器越走越快的原因19.4 解决定时器“越走越快”的问题
19.1 js定时器
在菜鸟教程中介绍到:
js 定时器有以下两个方法:
setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
setTimeout() :在指定的毫秒数后调用函数或计算表达式。
两个方法都有三个
setInterval(function(){}, milliseconds)——会不停的调用函数
setTimeout(function(){}, milliseconds)——只执行函数一次
乍看之下,setInterval会符合我们的业务需求,然而
按理清除定时器后,定时器里的代码不会再执行。但是通过控制台输出后发现定时器还在定时执行。。
最后debug出原因是因为,代码中包含了多个定时器。当一个定时器取消后,另一个还在继续。因此如果我们想多个定时器独立进行的话。每个定时的正确写法应该是:
let timer = setInterval(() => {
clearInterval(timer);//一定要写清楚是清除哪一个定时器
},200);
使用
setInterval() 创建的
定时器确保了
定时器代码规则地插入队列
中。这个方式的
问题在于,
定时器代码可能在代码再次被添加到队列之前还没有完成执行,结果导致
定时器代码连续运行好几次,而之间没有任何停顿。幸好,
Javascript 引擎够聪明,能够避免这个
问题。当使用
setInterval() 时,仅当没有该
定时器的任何其他代码实例时,才将
定时器代码添加到队列
中。这确保了
定时器代码加入到队列
中的最小时间间隔为指定间隔。
下午的时候,产品说某项目的某功能不要了,客户看着眼花(mmp,这个功能当时非要吵吵着加上,现在过了好几版以后,又说不要了)
该功能是使用setinerval 实现的,为了省事,即没有回滚版本(该功能已经被覆盖了好几版了,不容易检出),也没有大片注释代码(注释执行方法以后,代码编辑以后会有已经声明,未使用的waring)
所以直接修改了setinerval的间隔时间。
但是直接修改成了1000 * 60 * 60 * 24 * 30 = 30天,后来发现代码直接快速执行,但是修改为2000 以后又正常。
1.可以在 clearInterval(timer) 先console一下timer的值,看看是什么
2.一般清除不掉setInterval的情况是因为每次在清除之前重新走了一遍改组件的js代码,使timer又成了初始值null,再去clearInterval(timer);肯定不会成功了。
解决办法: 再组件外声明 tim
问题很好理解,在业务环境需要的情况下,进入页面即执行,如做倒计时
把拥有定时器和渲染页面数据this.set,this.set,this.set,this.forceUpdate()函数,放在一起的时候
出现了问题:即在执行渲染函数时,页面重新生成了新的定时器,所以会造成 指数形式重复调用
解决问题:
1.只有一个定时器时,吧定时器定义到window下,执行前先行判断,如果有则不再创建,或者删除
if(!window.setTime){
window.setTime = setInterval(this.