多个setinterval(一个页面多个setInterval应该怎么办?)
一、js 中 setInterval的执行次数问题
虽然是老问题了,但是好像没看到有人解释一下为什么出错,上来给大家补一个
setInterval被包含在Interval所调用的函数里了,这就意味着每次循环,都会再启动一个Interval
也就是说,第一次的循环
timeDao--;
计数100- 1= 99
并且添加一个新的循环(当前有 2个循环进程)
第二次循环
99- 1= 98
98- 1= 97
并且两个现有循环各添加一个新的循环(当前有 4个循环进程)
第三次循环
97- 1= 96
96- 1= 95
95- 1= 94
94- 1= 93
...(不用再往下写了,相信已经说明了问题)
以下为修改代码:
<scripttype="text/javascript">
varsh=null;//时钟对象
vartimeDao=100;//计数器
//FUNCTION::dao()
//计数递减函数
functiondao(){
divD.innerText=timeDao;
if(timeDao==0){
if(sh!=null)clearInterval(sh);
sh=null;
return;
}
timeDao--;
}
//FUNCTION::startsh()
//启动计时器
functionstartsh(){
sh=setInterval("dao()",1000);
}
</script>
<divid="divD"onclick="startsh()">sdfa</div>
二、运行时,为什么会先执行第2个setInterval,然后再执行第1...
你写的有问题,首先是for循环里有两个setlnterval,按你的想法就是先执行完第一个再执行第二个,这是for循环,当他到第一个setlnterval时,第一个setlnterval只是25毫秒执行一次,但这个for循环不会等到他执行完,而是直接返回,然后再循环跑到第二个,
这还没完当他跑到第二个时赋值k=380;
var x= setInterval(function s(){k<=380?o.style.height=(k+=10)+"px":clearInterval(x);},25)}
这是第一个,按说第一个k的应该是10或20,但是错了第一个setlnterval在执行行的时候直接用的是第二个setlnterval里面定义的k了,(变量重名了,还有变量的作用域和优先级),这时两个都在运行了,你看到的是只有第二个在走是因为第一个div的高一直在用第二个div的高,虽然他自己也+10,但第二个比第一个快5毫秒,你根本看不见第一个的变化,太快了,以至于第二个完了,k这时等于0了,所以你看到的是第一个才开始运行
改成2000第一无法运行,是因为他(第一个setlnterval)已满足条件了,k已经定于380,他(第一个setlnterval)就停止,
上边为什么会运行,就是你设的时间,第二个比第一个快5毫秒
三、js setInterval怎么设置执行次数
settimeout(执行函数,时间)能满足你的要求,setinterval(执行函数,时间)不行。
因为settimeout只运行一次而setinterval多次运行,每次timeout后再调用一次自己也就达到了多次运行的效果,并且每次调用的时间间隔可以不一样
如
var
timer=1000;//这里定义一个全局变量,其它地方可能修改它
t=function(){
//your
code
here
//do
something
timer+=10;//在这修改timer,当然,你在外面修改的话就把这个注释掉
settimeout(t,timer);//再次调用
}
settimeout(t,timer);//全局调用一次。