2011-07-12 83 views
1

我一直有問題,在使用setInterval:如何清除setInterval的所有實例?

$('li.item').live('click', function(){ 
    //Need to work with Dyn created object 
    //clearInterval(itemClockInterval); 
    itemClockInterval = setInterval(function() { 
     deconInterval(_this.children('.timeleft'), time); 
    }, 1000); 
}); 

有多種李鴻章與類「項目」。單擊時,setInterval函數會更新附加到該特定li的時鐘。

我的問題是,每次單擊li時,時鐘的倒數會比以前快兩倍,因爲正在運行一個額外的時間間隔。我需要在新的時間間隔開始之前清除間隔的所有實例,但是我的解決方案都不起作用。

我評論了我嘗試過的一件事情,看起來間隔不是直到後來才產生,這是有問題的。

+0

您的問題可能在其他地方。你在那裏定義的'_this'是什麼?我不確定你是否正確地構造了整個事物,這就是爲什麼你遇到問題 - 並不是因爲setInterval是邪惡的,它非常不邪惡。 – davin

+0

嗨,對不起。我省略了一些代碼,並且我忘記將_this var更改爲$(this),我使用_this代替了另一部分代碼 – TaylorMac

回答

3

商店使用.data()的元素上的setInterval()的結果並單擊清除它。

$('li.item').live('click', function(){ 
    $this = $(this); 
    var existing_timer = $this.data('clock'); 
    if (existing_timer){ 
     clearInterval(existing_timer); 
    } 
    itemClockInterval = setInterval(function() { 
        deconInterval($this.children('.timeleft'), time); 
    }, 1000); 
    $this.data('clock', itemClockInterval); 
}); 
+0

非常有用。其他答案也是足夠的。我只是想知道,數據總是必須與HTML元素相關聯嗎? – TaylorMac

+0

@TaylorMac是的,儘管你可以使用'body',但數據必須與一個元素相關聯。另一種方法是使用本地存儲(cookie,HTML5存儲等)。看看http://www.jstorage.info/ –

2

使用閉包:

$('li.item').live('click', (function(){ //Need to work with Dyn created object 
    var itemClockInterval; 

    return function(){ 
    if(itemClockInterval) clearInterval(itemClockInterval); 
    itemClockInterval = setInterval(function() { 
      deconInterval(_this.children('.timeleft'), time); 
     }, 1000); 
    }; 
})()); 

或者,使用jQuery的數據的方法:

$('li.item').live('click', function(ev){ //Need to work with Dyn created object 
    var itemClockInterval = $(ev.target).data("itemClockInterval") 
    if(itemClockInterval) clearInterval(itemClockInterval); 
    $(ev.target).data("itemClockInterval", setInterval(function() { 
      deconInterval(_this.children('.timeleft'), time); 
    }, 1000)); 
}); 
+0

我看到@amit_g在我編輯之前獲得了數據解決方案。 – Ian

1

使用data存儲與李有關的intervalID ...

$('li.item').live('click', function(){ //Need to work with Dyn created object 
    var itemClockIntervalID = $(this).data("itemClockIntervalID"); 

    if (itemClockIntervalID != "undefined") { 
     clearInterval(itemClockIntervalID); 
    } 

    itemClockIntervalID = setInterval(function() { deconInterval(_this.children('.timeleft'), time); }, 1000); 

    $(this).data("itemClockIntervalID", itemClockIntervalID); 
}); 
0

或者使用jQuery的能力,這裏所描述跟蹤定時器的你:http://plugins.jquery.com/project/timers。它會自動維護一個jQuery對象和你的計時器之間的關聯,以便跟蹤前一個計時器,以便在設置新計時器之前清除間隔。