Вопрос по jquery – setTimeout не работает с jquery.each, это

7

Я пытаюсь добавить задержку между вызовами jquery .removeClass, перебирая ячейки таблицы. Ячейки отображаются правильно, без setTimeout, но с setTimeout код прерывается. Что я делаю неправильно?

function reveal_board() {
$("td").each(function() {
    var t=setTimeout('$(this).removeClass("invisible")', 500);
});
}

Ваш Ответ

4   ответа
1

Ну, у меня была та же проблема, и я решил ее таким образом ... Но я не имею представления о выступлениях или о чем-то другом, я использовал его в очень коротком цикле (максимум 10 элементов), и он работал отлично ... как я использовал его для добавления класса, поэтому я позволю вам выяснить, что он дает для удаления класса;).

var elements = $(".elements");
var timeout;

elements.each(function(e){
    timeout = setTimeout(function(index) {
       elements[elements.length-e-1].setAttribute('class', elements[elements.length-e-1].getAttribute('class')+' MY-NEW-CLASS');
    }, 500 * e);
});
19

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

function reveal_board() {
    $("div").each(function(index) {        
        (function(that, i) { 
            var t = setTimeout(function() { 
                $(that).removeClass("invisible"); 
            }, 500 * i);
        })(this, index);
    });
}

Обычно плохая практика - передавать строкуsetTimeout() а также я не думаю, что вы можете передавать любые переменные, используя его таким образом.

Я также завернул его в крышку, чтобы убедиться, чтоthat всегда относится к нужному элементу и не заменяется.

Хотя, как говорит NiftyDude, вы можете передать индекс и использовать его для отображения каждого элемента по очереди.

Рабочий пример -http://jsfiddle.net/Cc5sG/

EDIT

Похоже, вам не нужно закрытие:

function reveal_board() {
    $("div").each(function(index) {        
        var that = this;
        var t = setTimeout(function() { 
            $(that).removeClass("invisible"); 
        }, 500 * index);        
    });
}

http://jsfiddle.net/Cc5sG/1/

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded valen
1

Прежде всего, избегайте использования строки в качестве первого аргументаsetTimeoutвместо этого используйте функцию anon, поскольку ее легче отлаживать и поддерживать:

$("td").each(function() {
    var $this = $(this);
    var t=setTimeout(function() {
       $this.removeClass("invisible")
    }, 500);
});

Кроме того, я не совсем уверен, чего вы здесь добиваетесь (обновите ваш вопрос позже, и я адаптирую свой ответ), но если вы хотите удалитьinvisible класс от каждогоtd 500 мс друг за другом, вы можете использоватьindex:

$("td").each(function() {
    var $this = $(this);
    var t=setTimeout(function(index) {
       $this.removeClass("invisible")
    }, 500 * (index+1));
});
2

Вашthis указывает на глобальныйwindow.

function reveal_board() {
  $("td").each(function() {
    $this = $(this);
    var t=setTimeout(function(){$this.removeClass("invisible");}, 500);
  });
}

Похожие вопросы