代码之家  ›  专栏  ›  技术社区  ›  Rounin

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

  •  1
  • Rounin  · 技术社区  · 9 年前

    我有以下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 回复  |  直到 9 年前
        1
  •  2
  •   HBP    9 年前

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

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

    你的问题一定在于 i arrayLength ,尝试在每次迭代时显示这些变量

        2
  •  0
  •   Rounin    9 年前

    事实证明,答案就在脚本的其他地方——为了完整起见,我会把它包括进去。

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

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

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

    这使动画能够更快地开始,并使更多的动画在失败之前工作,但这并没有解决问题- setInterval 在一定次数的跑动后,他仍然在跑动并无限地击出空位。

    然后我想到 因为 动画是在实况中发生的 nodelist …也许 下一个 脚本的一部分(从中删除元素 节点列表 )开始得太快,离开 设置间隔 仍在努力 节点列表 文档中不再存在的元素。

    我的解决方案是增加 setTimeOut 在脚本的下一部分开始之前创建更大的延迟,但是 而且 添加其他 clearInterval 作为在 设置间隔 :

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

    这样,不仅 设置间隔 如果计数器到达 节点列表 的初始长度,但如果 脚本的下一部分 刚刚从中删除 节点列表 元素 设置间隔 即将开始工作。