js计时器问题
问题如下帖
http://topic.csdn.net/u/20090818/21/1bb0e369-8f7b-4be0-a725-05995199b717.html
帖子里的答案给出了解决方案。
我想知道原始代码的原理,为什么每次点击就会加速,“因为你每次点击按钮都会调用函数 而函数里面又会调用自身 所以就和到一起去了”这个回答太模糊了,我自己也感觉肯定是和一起了,哪位给出一步步的详细解答。
1.打开页面,点击开始计时按钮,调用timedCount(),进入函数体,第一步document.getElementById('txt').value=c,即显示0,第二步c=c+1,第三步,一秒后再次进入timeCout()从document.getElementById……
2.在三秒后,我再次单击开始计时按钮,又调用timeCout(),这时发生了什么,步骤是什么?当再次调用timeCout()时,上一个函数还在默默地继续执行?
------解决方案--------------------你这样理解:点一下时注册了一个定时器setTimeout("timedCount()",1000),一秒钟运行一次。当你第二次点击时再注册了一个定时器setTimeout("timedCount()",1000),变成一秒钟要运行两次。如果循环,每点一次速度就加一倍。
------解决方案--------------------定时器会累积 先清楚再启动定时器!
------解决方案--------------------你的setTImeout或者setInterval不有个线程ID么,初始化你赋值-1,然后如果它运行了肯定不等于-1
然后在你的函数里面判断下
if(iTimer > -1) return; 这样就不执行下面的代码了.
------解决方案--------------------
2.在三秒后,我再次单击开始计时按钮,又调用timeCout(),这时发生了什么,步骤是什么?当再次调用timeCout()时,上一个函数还在默默地继续执行?
是滴,你如果没有先清除定时器,又再次点击计时按钮,就等于是多了个每秒让c++了;
你清除的时候,是一个一个的去清除,直接清光所有定时器为止
因此你需要在调用定时器之前,先判断当前是否已经有正在运行的定时器,如果有,则清除它再开始。或者默认函数返回,不执行下面的setTimeout,以免定时器累积