2013-05-29 19 views
3

我在試圖知道setInterval()是否正在發生或它已被殺死時遇到問題。 我創建的間隔,並將其保存到一個變量:如何在控制檯中跟蹤正在執行多少個區間 - JavaScript

interval = setInterval('rotate()',3000); 

然後在點擊一個元素我停下來的時間間隔和開始一個新的人之前等待10秒,順便變化間隔是全球性的:

$(elm).click(function(){ 

    clearInterval(interval); 
    position = index; 

    $('#banner div').animate({ 
    'margin-left':position*(-img_width) 
    }); 

    setTimeout('startItnerval()',10000); 


}); 

function startItnerval(){ 

    interval = setInterval('rotate()',3000); 

} 

看來工作,但最終我意識到有間隔仍然到位,每次我開始一個新的時間間隔將被保存在區間變量,這是全球性的,因此從理論上講,即使我啓動100它們全部保存在同一個變量中,代替之前的時間間隔?所以我應該只有一個間隔的實例;然後在clearInterval(interval);它應該停止任何實例。

查看結果後,顯然即使它保存在同一個變量中,它們都是單獨的實例,需要單獨殺死。

我該如何追蹤正在執行的區間有多少,如果可能的話一個一個地識別它們?即使我能夠解決問題我真的想知道是否有一種方法可以在控制檯中統計或顯示正在執行多少個間隔?

感謝

+1

設置你這樣的間隔:'的setInterval(旋轉,3000);' - 如果你能在不通過串所有幫助。 – Pointy

+1

不,從理論上講,他們**並非全部都保存在「間隔」中......如果我對你說得對。您需要將每個間隔ID單獨保存在一個數組左右。 – Kiruse

回答

4

jsFiddle Demo

正如在評論中指出,該ID的不斷增加,因爲定時器被添加到頁面。其結果是,有可能清除網頁上運行的所有類似的計時器:

function clearTimers(){ 
var t = window.setTimeout(function(){ 
    var idMax = t; 
    for(var i = 0; i < idMax; i++){ 
    window.clearInterval(i); 
    window.clearTimeout(i); 
    } 
},4); 
} 

,因此你只能看到一個間隔是因爲每次啓動一個新的區間,您覆蓋值爲interval。這會導致之前的時間間隔丟失,但仍然處於活動狀態。

一個建議就是控制對變量的訪問。很明顯,在啓動功能調用過於頻繁

clearInterval(interval);//when you clear it, null it 
interval = null; 

再取,後來

if(interval != null){ 
interval = setInterval('rotate()',3000); 
} 

也是有利的,因爲尖在註釋中提到的問題,使用字符串來調用函數不是最佳實踐。它的基本功能是將其轉換爲與eval類似的Function表達式。你或許應該要麼使用功能名稱作爲回調

setInterval(rotate,3000); 

或具有匿名函數問題回調

setInterval(function(){ rotate(); },3000); 
+0

好的,但是有沒有一種方法可以在控制檯中統計或顯示正在執行多少個間隔? – multimediaxp

+0

@EddyXP - 如果你不跟蹤他們,請不要使用它。 –

+0

@EddyXP'interval'變量將保存一個數字的間隔id。這些數字是按順序排列的。例如。 http://jsfiddle.net/aML83/ – Bart

2

setInterval返回一個ID,而不是實際的對象,所以不,不間隔時間可能會如果你如果你想停止的時間間隔重複行

var xy = setInterval(function() {...}, 1000); 

重寫你要清楚它:

clearInterval(xy); 

如果你的startInterval可以連續多次調用,但你不希望創建多個間隔,就清除inverval你開始一個新的前:

function startInterval(){ 
    clearInterval(interval); 
    interval = setInterval('rotate()',3000); 
} 

如果你有創建多個間隔,可以爲您節省的ID在一個數組,以保持對它們的跟蹤:

var arr = []; 

//set the interval 
arr.push(setInterval(...)); 

//get number of currently running intervals 
var count = arr.length //gives you the number of currently running intervals 

//clear the interval with index i 
clearInterval(arr[i]); 
arr.splice(i, 1); 
+0

是的,在點擊,這正是我所做的'clearInterval(interval);'謝謝 – multimediaxp

+0

問題是你沒有通過覆蓋id來清除間隔。 – basilikum

相關問題