#jquery
#jquery
Вопрос:
Здесь скрипка:http://jsfiddle.net/F6nJu /
У меня есть цветное поле:
<div id="colorblock"></div>
#colorblock { background:#3ff; width: 100%; height: 300px; }
У меня есть массив цветов, созданный в javascript:
var arr = [ "#f00", "#ff0", "#f0f", "#f66"];
Я перебираю эти цвета с помощью функции jQuery each()
:
$.each(arr, function(key, value) {
$('#colorblock').delay('1200').animate({backgroundColor:value}, 600);
});
Когда массив повторяется до конца, как я могу начать итерацию массива заново (чтобы анимация продолжалась вечно)?
Комментарии:
1. Зачем выполнять итерации, когда можно просто использовать индексы массива?
i=0; arr[i % arr.length]
Ответ №1:
var arr = ["#f00", "#ff0", "#f0f", "#f66"];
// run through the array forever
(function recurse(counter) {
// get the colour
var color = arr[counter];
// animate it
$('#colorblock').delay('1200').animate({
backgroundColor: color
}, 600);
// delete the value to save memory
delete arr[counter];
// add the value at the end of the array
arr.push(color);
// run it again for the next number
setTimeout(function() {
recurse(counter 1);
}, 200);
// start it for the first number.
})(0);
Бесконечная рекурсия. Удалите текущую запись, затем добавьте текущее значение в конец.
Для тех, кому интересно, как выглядит массив:
["#foo", "#ff0", "#f0f", "#f66"] (counter = 0)
[undefined, "#ff0", "#f0f", "#f66", "#foo"] (counter = 1)
[undefined, undefined, "#f0f", "#f66", "#foo", "#ff0"] (counter = 2)
[undefined, undefined, undefined, "#f66", "#foo", "#ff0", "#f0f"] (counter = 3)
[undefined, undefined, undefined, undefined, "#foo", "#ff0", "#f0f", "#f66"] (counter = 4)
etc.
Комментарии:
1. я полагаю, вы используете мою
set_color
функцию?2. пожалуйста… (мы здесь, чтобы научиться этому … 😉 Последняя строка вашего кода:
})(0);
я играл с числами: 0, 1, 2, 3. Произошли интересные вещи. Что это такое на самом деле?3. @roXon добавил больше деталей / комментариев.
4. @Raynos… Вы так добры! Вы только что заработали 10! (Я просто не могу найти кнопку 😉 ну … 1
5. Идеальное решение… но как его переключить? Я пытаюсь использовать jQuery .toggle() с помощью stop() в recurse ()…
Ответ №2:
Попробуйте это:
var arr = ["#f00", "#ff0", "#f0f", "#f66"];
$.each(arr, function(key, value) {
set_color(value);
});
function set_color(color) {
$('#colorblock').delay('1200').animate({
backgroundColor: color
}, 600);
setTimeout(function() {
set_color(color);
}, 2000); //restart in 2 seconds
}
Комментарии:
1. это работает, спасибо! функция setTimeout (), похоже, не работает, но это неважно, поскольку я установил задержку перед анимацией.
2. @Neal… почему существует setTimeout, если установлена задержка? … если я уберу время ожидания, анимация остановится. Что на самом деле делает setTimeout? заранее спасибо!
3. @superUntitled, это 2 секунды для этого цвета, а не для любого цвета
4. @roXon
setTimeout
повторяет функцию5. $.каждый для массива, который не является элементами jQuery? Фу. Используйте цикл for или while.
Ответ №3:
Array.prototype.recurse = function(callback, delay) {
delay = delay || 200;
var self = this, idx = 0;
setInterval(function() {
callback(self[idx], idx);
idx = (idx 1 < self.length) ? idx 1 : 0;
}, delay);
}
Попробуйте это на StackOverflow:
["#f00", "#ff0", "#f0f", "#f66"].recurse(function(item, index) {
$('body').css('background-color', item);
}, 300);
Ответ №4:
var arr = ["#f00", "#ff0", "#f0f", "#f66"];
(function recurse(counter) {
var arrLength = arr.length;
var index = counter%arrLength;
var color = arr[index];
$('#colorblock').delay('1200').animate({
backgroundColor: color
}, 600);
setTimeout(function() {
recurse(counter 1);
}, 200);
})(0);
Комментарии:
1. Поскольку вопрос был задан и принят через 5 лет после публикации, я рекомендую вам добавить некоторые подробности о том, почему это решение лучше