2011-01-13 3 views
2

У меня есть массив: result [i]. Я хотел бы пройти через каждое поле в массиве и добавить его к элементу на моей странице.JQuery Queue() Каждый() с задержкой()

$("tr:first").after(result[i]); 

Но я бы хотел, чтобы это произошло с задержкой.

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

Заранее спасибо.

ответ

6

Попробуйте queue:

$.each(result, function(idx, val) { 
    $("tr:first").delay(1000).queue(function(next) { 
     $(this).after(val); 
     next(); 
    }); 
}); 

Просто чтобы быть полным, это для JQuery 1.4. В более ранних версиях, обратный вызов должен выглядеть следующим образом:

function() { 
    // do whatever here 
    $(this).dequeue(); 
} 
+0

Нужно было $ (это). перед тем, как работать, но он только добавляет первый. – jackreichert

+0

@ jackreichert: Да, я исправил это. Должна работать сейчас (если вы используете jQuery 1.4). –

+0

Сладкий. Разве это не должно быть 'function (next) {after (val); следующий(); } '? –

1
$(result).each(function(i) { 
    $("tr:first").delay(1000).after(result[i]); 
}); 
+0

Это добавит * все * результаты при t = 1000, а не результат один при t = 1000, результат два при t = 2000, результат три при t = 3000 и так далее. –

+0

нет, все еще всплывая сразу. – jackreichert

+0

зависит от того, как вы смотрите на вопрос – hunter

2

Вот, сила рекурсии:

(function append(i) { 
    if (i >= result.length) return; 
    $('tr:first').after(result[i]); 
    setTimeout(function(){append(i+1)},1000); 
})(0); 

Вы можете добавить дополнительные SetTimeout в зависимости от того, требуется ли первый элемент появляться сразу или после задержки.

+0

сладкий! Почему это в()? – jackreichert

+1

Это определение анонимной функции (да, глупое имя), называемое append, и вызов ее сразу с аргументом '0'. Функция() вокруг функции там, чтобы убедиться, что это анонимная функция, иначе анализатор может ошибочно принять ее за определение функции. –

1

Другим способом вы могли бы справиться с этим с помощью цикла через результирующий массив и создание кучи setInterval или .delay() вызывает функцию, с задержками, которые зависят по индексу массива. Например:

for(var i = 0; i < result.length; i++){ 
    $('tr:first').delay(i*1000).after(result[i]); 
} 

Чтобы быть уверенным, это не так хорошо, как решение рекурсивных один представленного @Victor выше, но это другой подход, в случае, если вам не нравится рекурсия по какой-либо причине.

+0

Осторожно. Использование '$ .each()' более безопасно, чем for-loop из-за правил определения для 'i' –

+0

Извините, никогда не использовал' $ .each() 'для массива, охватывающего раньше, поэтому я бы не чувствовал себя хорошо, пытаясь напишите код с манжеты, которая его использует. знак равно –

Смежные вопросы