2016-02-22 32 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即將開始工作。