2012-01-20 93 views
0

我有我的clearInterval問題,它不會停止我的setInterval,這裏是代碼:clearInterval不起作用

$(".auto-check").click(function(){ 
    if($('input[name=autorefresh]').is(':checked') == true){ 
     var intervalId = setInterval(load,4000); 

    } 
    else{ 
     alert("Auto Refresh is off"); 
     clearInterval(intervalId); 
    } 

}); 

誰可以告訴,這裏是什麼問題?

回答

0

試試這個:

var intervalId = null; 

$('.auto-check').click(function(){ 
if($('input[name=autorefresh]').is(':checked') == true) { 
    intervalId = setInterval(load,4000); 
} else { 
    alert('Auto Refresh is off'); 
    clearInterval(intervalId); 
} 
}); 
1

你需要保持intervalId。在你的情況下,你在本地聲明它,並在函數後丟失。在函數之外聲明它,在裏面定義它,然後它將是有效的。

var intervalId; 

$(".auto-check").click(function(){ 
if($('input[name=autorefresh]').is(':checked') == true){ 
    intervalId = setInterval(load,4000); 

} 
else{ 
    alert("Auto Refresh is off"); 
    clearInterval(intervalId); 
} 

}); 
+0

謝謝!這樣可行! –

0

正如其他人所指出的那樣,你需要你的時間間隔對象的範圍比其所包圍的功能的範圍更大,作爲下一次單擊元素(一個或多個)新的回調函數將用一個全新的範圍來創建;你的間隔將是一個全新的對象,每次點擊。

編輯:雖然很長的視頻,這裏是範圍鏈和執行上下文的詳細說明,詳細說明執行函數時會發生什麼。說明大約5分鐘開始:http://googlecode.blogspot.com/2009/06/nicholas-c-zakas-speed-up-your.html

3

只是爲了討論的方便,使用jQuery .data()

$(".auto-check").click(function(){ 
    var elem = $('input[name=autorefresh]' 
    if(elem.is(':checked')){ 
     elem.data("interval-id", setInterval(load,4000)); 
    } 
    else{ 
     alert("Auto Refresh is off"); 
     clearInterval(elem.data("interval-id")); 
     elem.removeData("interval-id"); 
    } 
}); 
+0

+1使用'.data()',使這個可擴展到多個元素,並避免全局變量。 – jfriend00

0

什麼關於此問題的另一種方法?

$(".auto-check").click(function(){ 
if($('input[name=autorefresh]').is(':checked') == true){ 
    window.intervalId = setInterval(load,4000); 

} 
else{ 
    alert("Auto Refresh is off"); 
    clearInterval(window.intervalId); 
} 

});