Цикл с задержкой jquery / js

Имею светофор - 3 цвета:

<div class="green" id="ready"></div>
<div class="orange" id="steady"></div>
<div class="red" id="go"></div>

и массив:

var status = ["ready", "steady", "go"];

Я хочу добавить и удалить класс (для имитации мигания) из каждого цикла в бесконечности с некоторой задержкой, но этот код делает все это за один раз. Как я могу это решить?

jQuery.each(status, function() {
    setTimeout(function() {
        $("#" + this).addClass('active');
    }, 3000);
});

person Vojtech Lacina    schedule 13.03.2013    source источник
comment
умножьте задержку на индекс каждой итерации.   -  person Kevin B    schedule 13.03.2013
comment
верните тег ‹blink›!   -  person geedubb    schedule 13.03.2013
comment
Работа с очередью: stackoverflow.com/questions/2510115/   -  person Jonny Sooter    schedule 13.03.2013
comment
Кстати: зеленый готов, а красный пошел ...?   -  person Tim Büthe    schedule 13.03.2013


Ответы (3)


http://jsfiddle.net/9feh7/

Вы настраиваете все на запуск сразу. Каждый раз умножайте на индекс.

$('#ready, #steady, #go').each(function(i) { 
    var el=$(this);
    setTimeout(function() { 
        el.addClass('active');
    }, i * 3000); 
});

Обратите внимание, что i в первом экземпляре равно 0, поэтому, если вы хотите #ready подождать 3 секунды, используйте (i+1) * 3000

Кроме того, $('#'+this) неверный синтаксис, это $(this), однако это не сработает внутри setTimeout.

Используйте setInterval вместо setTimeout для запуска цикла до бесконечности (если не снят).

person Popnoodles    schedule 13.03.2013
comment
О, спасибо большое - теперь он работает, но с $ ('#' + status [i]). AddClass ('active'); Теперь, как я могу запустить его в бесконечном цикле? - person Vojtech Lacina; 13.03.2013
comment
используйте setInterval вместо setTimeout: developer.mozilla.org/en-US/ документы / DOM / window.setInterval - person j_mcnally; 13.03.2013
comment
@VojtechLacina, j_mcnally отвечает вам. - person Popnoodles; 13.03.2013

Попробуй это:

var status = ["ready", "steady", "go"];
var i=1;
jQuery(status).each(function(index,value) {
    var self=this;
    setTimeout(function() {
       $(self).addClass('active');
    }, 3000*i);
    i++;
});

Fiddle: http://jsfiddle.net/M9NVy/

person Rohan Kumar    schedule 13.03.2013
comment
Зачем добавлять еще одну переменную i, если вы уже создаете index? - person Popnoodles; 05.08.2015
comment
Поскольку индекс будет начинаться с 0, что добавит активный класс без каких-либо задержек. Вместо этого мы можем использовать index+1. - person Rohan Kumar; 06.08.2015

Я бы сказал, что вам лучше цепляться за свою конечную цель.

1) Настройте функцию для красного цвета. в конце красного функционального расписания желтый с установленным таймаутом 1000 мс. 2) В конце желтого расписания таймаут 1000 мс для красного

3) В конце зеленого расписания таймаут 1000 мс для зеленого.

4) запустите свой код, вызвав red ()

Теперь он будет повторяться бесконечно, не увеличивая время ожидания.

Если вам это не нравится, я бы использовал setInterval, а не setTimeOut, но вам может понадобиться больше математики.

person j_mcnally    schedule 13.03.2013