Ivan-P
@Ivan-P

Почему не работает setInterval?

Есть такой код. Почему-то фон li меняется не с задержкой в 1с, а мгновенно.

var ul = document.getElementById("blink");
var li = ul.getElementsByTagName('li');

for(var i = 0; i < li.length; i++) {
setInterval(blink(), 1000);
}

function blink() {
li[i].classList.toggle('cls');
}
  • Вопрос задан
  • 3541 просмотр
Пригласить эксперта
Ответы на вопрос 4
KorsaR-ZN
@KorsaR-ZN
А потому-что Вы функцию blink вызываете в цикле (вообщем нужно без скобок), и вообще такая конструкция работать правильно не будет.

Сделайте так:
for (var i = 0; i < li.length; i++) {
   setInterval(blink, 1000); 
}


UPD
Чтоб правильно работало, скажите что вы хотите добится? и зачем Вам тут цикл.
Просто из-за того, что функция выполняется с задержкой, вы всегда будете иметь n = li.length - 1
Да и к тому-же blink будет вызван больше раз, чем вы задумали :)
Ответ написан
lbondodesc
@lbondodesc
PHP Developer
Неправильно записан первый аргумент функции setInterval() ! Как правильно
Ответ написан
@GreatRash
Логичней не создавать кучу интервалов, а менять класс у родителя, т.е. у ul. А уж в зависимости от того какой класс у родителя дети будут мигать. Таким образом вам понадобится всего один интервал, а не куча на каждого потомка.
Ответ написан
Выложил код на jsfiddle.net
var ul = document.getElementById('blink'),
    li = ul.getElementsByTagName('li');

for(var i = 0; i < li.length; i++) {
	(function(el, i) {
        setInterval(function() {
            blink(el, i) 
        }, 1000);
    })(li, i);

}

function blink(el, i) {
	el[i].classList.toggle('cls');
}


1. У вас не правильно написан setInterval(). Функция blink() сразу вызывается походу исполнения цикла.
2. Чтобы понять код прочитайте про Замыкания и ссылки в руководстве JavaScript Гарден
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы