2016-02-22 27 views
1

我有以下的javascript:无法获得clearInterval工作,尽管一些方法

var i = 0; 
var intervalCounter = setInterval(function(){ 

    [... CODE HERE ...] 

    if (i >= (arrayLength - 1)) { 
     clearInterval(intervalCounter); 
    } 

    else { 
     i++; 
    } 
}, 200); 

但是,(你已经猜到了),clearInterval(intervalCounter);不清除的时间间隔。

我能理解这一点,如果if条件为

if (i === (arrayLength - 1)) 

,但如何能在JavaScript引擎一再错过i(arrayLength-1)更大?

+0

我明白,clearInterval必须是一个主要的绊脚石,因为很多JavaScript学习者似乎绊倒了它。我已经搜索过,找不到任何与之相关的问题,但如果我错过了,请给我一个小题,然后我会删除这个问题。非常感谢。 – Rounin

+1

你正在初始化我什么? arrayLength的价值是什么?我怀疑问题在于其中一个 – StephenTG

回答

2

下面的代码工作正常,经过9控制台上显示0:

var a = Array (10), 
    i = 0, 
    intervalCounter = setInterval(function(){ 
     console.log (i); 
     if (i >= (a.length - 1)) { 
      clearInterval(intervalCounter); 
     } 
     else { 
      i++; 
     } 
    }, 200); 

你的问题一定是与iarrayLength价值,尝试在每次迭代

+0

确认脚本本质上是有效的,并且问题是两个变量中的任何一个被检查帮助我找到解决方案的很长一段路 - 有第三个变量我没有考虑到(请参阅下面的答案)。非常感谢! – Rounin

0

事实证明显示这些变量将答案放在其他地方,进一步放在脚本的后面 - 为了完整起见,我会将其包含在内。

从各种测试中,它看起来像错误与脚本执行的速度有关。脚本控制其发生在页面加载快的动画,所以我改变了事件侦听器

window.addEventListener('load',activateAnimation,false); 

window.addEventListener('DOMContentLoaded',activateAnimation,false); 

这使动画较快地开始 - 和更多的动画工作在它失败之前 - 但它没有解决问题 - setInterval仍然在运行并在经过一定次数的运行后无限空白。

然后,它发生,我认为因为动画正在发生的实况nodelist内...也许下一个脚本(这从nodelist删除元素)的一部分很快就开始过,留下setInterval仍在尝试处理文档中不再存在的nodelist元素。

我的解决办法是增加setTimeOut开始脚本的下一部分之前创建一个更大的延迟,但增加一个额外的clearInterval作为脚本的setInterval内运行的顶线:

if ((i + 1) > elements.length) {clearInterval(enterHashtag);} 

这样的话,不仅会在setInterval清楚自己如果计数器达到nodelist的初始长度的结束,但它如果脚本的下一部分刚刚从nodelist的去除也很清楚自己元素setInterval即将开始工作。