перезапуск setInterval

Итак, у меня есть таймер, который вращает набор изображений каждые 5 секунд. Поэтому я запускаю это при запуске документа.

$(document).ready(function() {
var intervalID=setInterval(function(){ 
     rotate();    
}, 5000);
});

Функция Rotate просто поворачивает изображения. Однако я также позволяю пользователю вручную выбирать изображение, на которое он смотрит. Из-за этого мне нужно отменить SetInterval, а затем снова запустить его через 5 секунд.

То, что я пытаюсь сделать, это отменить интервал, а затем начать его заново, выполнив это

$('a').click(function(){
 clearInterval(intervalID);   
 intervalID=setInterval(function(){ 
     rotate();    
}, 5000);    
});

Однако код, похоже, не сбрасывает интервал, как я надеялся.


person user646655    schedule 28.07.2011    source источник
comment
ОТ: Вместо setInterval(function(){rotate();}, 5000) можно написать setInterval(rotate, 5000).   -  person Felix Kling    schedule 28.07.2011


Ответы (3)


Просто сделайте intervalID глобальной переменной, объявив ее вне и выше всех функций.

С вашим текущим кодом его область действия ограничена методом $(document).ready(), поэтому это может вызвать описанную вами проблему.

person Shadow Wizard Wearing Mask V2    schedule 28.07.2011
comment
@ Тим, спасибо за совет и за то, что поделился своим личным мнением, но пока я не увижу доказательств, почему они такие плохие, я буду продолжать их использовать. - person Shadow Wizard Wearing Mask V2; 28.07.2011
comment
@ShadowWizard: Доступ к глобальным переменным самый медленный, возможно, вы сталкиваетесь с другими сценариями в глобальном пространстве имен, сложно читать код, в котором переменные объявлены где-то вне области видимости, .. мне продолжать? - person jAndy; 28.07.2011
comment
@jAndy может быть правдой, когда у вас много кода, но здесь это не похоже. Когда исходный код прост, я предпочитаю придерживаться простого кода, и простое перемещение одной строки за пределы функции кажется мне самым простым решением. Я не пытаюсь дать идеальный ответ/решение, просто то, что ОП поймет лучше всего и будет легко реализовать. - person Shadow Wizard Wearing Mask V2; 28.07.2011
comment
Я не буду вдаваться в споры о глобальных переменных, других уже достаточно. Дело в том, что если у вас возникают ошибки из-за того, что ваш глобал конфликтует с какой-то библиотекой, вам будет трудно найти ее. Кроме того, другие ответили на этот вопрос и предложили элегантные решения, которые не сложнее и не сложнее реализовать. - person Tim Büthe; 28.07.2011
comment
@ Тим, достаточно честно, что касается других ответов, это должен решить ОП. - person Shadow Wizard Wearing Mask V2; 28.07.2011
comment
@ShadowWizard: я понимаю вашу точку зрения, но даже самый короткий код не является оправданием для того, чтобы не использовать лучшие практики. - person jAndy; 28.07.2011
comment
@jAndy хорошо, анонимный метод самовызова, который вы указали, действительно выглядит как лучшая практика, но пока у меня не будет времени, чтобы изучить его подробно, я не могу дать это в своих ответах. - person Shadow Wizard Wearing Mask V2; 28.07.2011
comment
@jAndy: Если глобальным переменным даются такие имена, как supercatWizlibTimer, насколько они проблематичны? Хотя может быть лучше иметь одну всеобъемлющую переменную supercatWizlib для библиотеки и использовать что-то вроде supercatWizlib.timer, насколько это на самом деле отличается от простого использования отдельных глобальных переменных? - person supercat; 20.12.2014

Если переменная intervalID объявлена ​​в области .ready(), должно работать следующее (непроверено):

$(document).ready(function() {
    var rotate = function() { ... },
        intervalID = setInterval(rotate, 5000);

    $('a').click(function() {
       clearInterval(intervalID);   
       intervalID = setInterval(rotate, 5000);    
    });
});
person jensgram    schedule 28.07.2011

Что ж, похоже, вы объявляете interverID локально внутри анонимной функции из вашего обработчика .ready(). На самом деле мне интересно, почему вы не сталкиваетесь с ошибкой ссылки в обработчике события клика, поскольку intervalID там не может быть известно.

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

(function _myPrivateContext($, window, document, undefined) {
    var intervalID = null;

    $(document).ready(function() {
       intervalID = setInterval(rotate, 5000);
    });

    $('a').click(function(){
        clearInterval(intervalID);   
        intervalID = setInterval(rotate, 5000);    
    });

}(jQuery, window, document));
person jAndy    schedule 28.07.2011
comment
Не думайте, что вы хотите устанавливать обработчики onclick до загрузки DOM. Вы можете попробовать live(). - person Peter Ajtai; 05.02.2012