2012-01-20 3 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

Как уже отмечалось, необходимо объем вашего интервала объекта должно быть больше объема функции, в которой она заключена, в следующий раз, когда вы щелкните элемент (ы) новую функцию обратного вызова будет создан с совершенно новой областью; ваш интервал будет полностью новым объектом с каждым щелчком.

EDIT: в то время как длинное видео, вот подробное объяснение цепей областей и контекстов выполнения, подробно описывающих, что происходит, когда функция выполняется. Объяснение начинается примерно 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); 
} 

});

Смежные вопросы