Перезапуск setInterval () в Javascript / jQuery (без clearInterval)

Я работаю над вкладками пользовательского интерфейса, созданными с использованием jQuery. Все работает, за исключением одной проблемы - я сделал setInterval, который запускает функцию, которая запускает триггер («щелчок»), чтобы перейти к следующей вкладке через 5000 миллисекунд. Он проходит через каждую вкладку нормально, проблема в том, что если пользователь вручную щелкает вкладку, таймер для setInterval не перезапускается обратно с 0. Например, если пользователь должен был запустить вкладку 1 в 0 миллисекунд и щелкнуть вкладку 2 в 2000 миллисекунд, setInterval не возвращается к 0, он начнется с 2000 и продолжится до 5000 миллисекунд, а затем перейдет к tab3. Я понимаю, почему это происходит, мне просто интересно, есть ли способ перезапустить время setInterval без необходимости выполнять clearInterval () и создавать совершенно новый setInterval (). Любое понимание будет оценено.

Обновить

Спасибо за ответы. Причина, по которой я пытался избежать использования clearInterval, заключалась в том, что у меня были проблемы с написанием кода таким образом, чтобы clearInterval полностью остановил setInterval. Код настроен для отслеживания, когда пользователь щелкнул вкладку. Проблема в том, что функция автоматического изменения использует триггер («щелчок»), поэтому он запускает функцию clearInterval, которую я написал также при автоматическом изменении вкладок. Кажется, что он работает довольно хорошо сам по себе, но как только пользователь начинает нажимать на вкладки, setInterval ведет себя необычно и непредсказуемо переключает вкладки. Я подозреваю, что происходит одновременное выполнение нескольких setInterval ... Вот код (если вы еще не догадались, я новичок в javascript / jquery). Я закомментировал части, чтобы он работал, но он все еще не работает так, как я предполагал (из первого сообщения).

// auto change tabs
            if( options.interval ) {

                function timerCom() {
                    if( !$(".controller").hasClass('paused') ) {
                        var i = $(".tab-current > a").attr("rel");
                        //alert(i);
                        if( i == 3 ) {i = 0};
                        $container
                            .find('a')
                            .eq(i)
                            .trigger('click');
                    }    
                }

                //$("#promo-items > li > a").click(function () {
                    //var timer;
                    //if( timer != null ) {clearInterval(timer);}
                    timer = setInterval(timerCom, options.interval);

                //});

            }

person art15t    schedule 01.12.2010    source источник
comment
Добро пожаловать в SO! Пожалуйста, отредактируйте свой вопрос, если вам нужна дополнительная информация. Используйте комментарии для конкретных вопросов об ответах. ТАК - это не форум, поле ответа строго зарезервировано для ответов на вопрос.   -  person Tim Post♦    schedule 23.02.2011


Ответы (3)


Нет, невозможно перезапустить таймер, установленный setInterval, без очистки таймера.

person Ali    schedule 01.12.2010

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

var intervalID;
var resetTimer = function() {
  if (intervalID) { clearInterval(intervalID) };
  intervalID = setInterval(function() {
    console.log('doing stuff!');
  }, 5000);
};
person Alex Wayne    schedule 01.12.2010
comment
такой способ использования фигурных скобок делает код практически нечитаемым: P. Подтяжки должны быть на отдельных линиях - person Ali; 01.12.2010
comment
Меня не интересуют дебаты, но на самом деле в стандарте кодирования Google сказано, что из-за неявной вставки точки с запятой всегда начинайте фигурные скобки с той же строки, что и открываемые ими символы. google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml - person DaveWalley; 11.01.2014

Я знаю, что этому посту больше двух лет, но я только что столкнулся с похожей проблемой и нашел решение.

Я писал скроллер изображений, который автоматически переходил к следующему изображению через заданный промежуток времени, и всякий раз, когда я нажимал кнопки навигации, переходы перемещались дважды.

Вот мое решение:

Сделайте переменную интервала (timer в вашем случае) несколько глобальной.

то есть в разделе options (при условии, что он был определен ранее, а затем назначен позже) добавьте нулевую timer переменную.

var options = {
'interval',
//Other variables
'timer',
};

Затем дважды вызовите clearInterval при обработке события щелчка.

$("#promo-items > li > a").click(function () {

if( options.timer != null ) {
clearInterval(options.timer);
clearInterval(options.timer);
}

options.timer = setInterval(timerCom, options.interval);

});

Сработало для меня как шарм.

Опять же, извините, если это слишком поздно.

person Ryan Willis    schedule 02.09.2013