尽管有几种方法,但无法让 clearInterval 工作

Can't get clearInterval to work, despite several approaches

我有以下 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)

以下代码工作正常,在控制台上显示 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 的值,尝试在每次迭代时显示这些变量

原来答案在别处,在脚本的更下方 - 为了完整起见,我将把它包括在内。

从各种测试来看,错误似乎与脚本执行速度有关。该脚本控制页面加载时发生的快速动画,因此我将事件侦听器从

更改为
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 即将开始处理的元素。