尽管有多种方法,但无法使用clearInterval

时间:2016-02-22 18:42:35

标签: javascript setinterval clearinterval

我有以下javascript:

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)

2 个答案:

答案 0 :(得分:2)

以下代码正常工作,在控制台上显示0到9:

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

您的问题必须是iarrayLength的值,请尝试在每次迭代时显示这些变量

答案 1 :(得分:0)

事实证明,答案在其他地方,脚本的下方 - 为了完整起见,我将其包括在内。

从各种测试中,看起来错误与脚本执行的速度有关。该脚本控制在页面加载时发生的快速动画,因此我从

更改了事件监听器
window.addEventListener('load',activateAnimation,false);

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

这使得动画能够更快地启动 - 并且在动画失败之前让更多动画工作 - 但它没有解决问题 - setInterval仍在运行并且在某些情况下无限制地执行空白运行次数。

然后我发现因为动画发生在实时nodelist ...可能是脚本的 next 部分(删除)来自nodelist)的元素过早开始,setInterval仍在尝试处理文档中不再存在的nodelist元素。

我的解决方案是在脚本的下一部分开始之前增加setTimeOut以创建更大的延迟,但添加额外的clearInterval作为顶线在setInterval中运行的脚本:

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

这样,如果计数器到达setInterval的初始长度的末尾,nodelist不仅会自行清除,而且如果下一个,它也会自行清除脚本的一部分刚刚从nodelist setInterval即将开始工作的元素中移除。