Как добавить паузу между каждой итерацией jQuery.каждый()?
Я хватаю массив объектов jQuery, а затем через.каждый () изменяет каждый отдельный jquery с в массиве.
в этом случае я обновил имена классов, чтобы вызвать свойство-webkit-transition-для использования перехода css.
Я хотел бы, чтобы была пауза перед началом каждого перехода css. Я использую следующее, Но между каждым обновлением нет задержки. Вместо этого все они, похоже, обновляются одновременно.
function positionCards() {
$cards = $('#gameboard .card');
$cards.each(function() {
setTimeout( function(){ addPositioningClass($(this)); }, 500 )
});
}
function addPositioningClasses($card){
$card
.addClass('position')
}
Я надеялся setTimeout решил бы это, но он, похоже, не работает. Есть ли способ выполнить паузу перед каждым обновлением имени класса каждого объекта?
8 ответов
Я добавил Это как комментарий, но теперь, когда я прочитал его правильно и ответил на свой собственный вопрос, это, вероятно, сработает:
function positionCards() {
var $cards = $('#gameboard .card');
var time = 500;
$cards.each(function() {
setTimeout( function(){ addPositioningClass($(this)); }, time)
time += 500;
});
}
Извините, что выкапываю старую нить (и для моего плохого английского), но этот совет может быть полезен для других подобных случаев:
$cards.each(function(index) {
$(this).delay(500*index).addClass('position');
});
Если вы создадите метод, который вызывает себя каждые 500 мс, который должен сделать этот трюк. Следующий код должен работать.
var __OBJECTS = [];
$('#gameboard .card').each(function() {
__OBJECTS.push($(this));
});
addPositioningClasses();
function addPositioningClasses() {
var $card = __OBJECTS.pop();
$card.addClass('position');
if (__OBJECTS.length) {
setTimeout(addPositioningClasses, 500)
}
}
протестировано на скрипке:http://jsfiddle.net/jomanlk/haGfU/
как о .delay () ?
или
function addPositioningClasses($card){
setTimeout(function() { $card.addClass('position')}, 1000);
}
Если вы ориентируетесь только на Safari / iOS, в зависимости от того, насколько важно для вас контролировать точное время последовательностей анимации, вы должны избегать любого решения, которое включает таймауты JS. Нет никакой гарантии, что анимация будет завершена одновременно с задержкой тайм-аута, особенно на медленных процессорах или машинах, у которых много вещей происходит в фоновом режиме. Более поздние версии webkit (включая mobile safari) позволяют использовать временные последовательности анимации через @-webkit-keyframes
. Webkit.org имеет хорошее вступление к нему. На самом деле это довольно легко реализовать.
попробуйте:
function positionCards() {
$('#gameboard .card').each(function() {
$(this).delay(500).addClass('position');
});
}
Я буду честен... У меня было $(это).delay() плохо себя ведет в прошлом в некоторых случаях и безупречно работает в других. Однако это обычно происходило в сочетании с вызовами анимации jQuery, а не с манипуляцией атрибутами DOM.
пожалуйста, имейте в виду .delay () не работает так же, как setTimeout. Дополнительные сведения см. В разделе jQuery .задержка() документация.
насколько мне известно, $().каждый делает выполните процедурно, поэтому следующая итерация вызова должна начинаться только после завершения предыдущей.
проверьте это, хорошо сработало для меня! :)
jQuery('.optiresultsul li').each(function(index) {
jQuery(this).delay(500*index).animate({ opacity: 1 }, 500,function(){
jQuery(this).addClass('bgchecked');
});
});
этот код добавит установить задержку inital в 50 мс. Затем для каждого цикла через ".класс " row " добавит дополнительную задержку в 200 мс. Это создаст хороший эффект отложенного шоу для каждой строки.
$( document ).ready(function() {
// set inital delay
var dtotal = 50;
$(".row").each(function() {
//add delay to function
$(this).delay(dtotal).show();
//add 200ms to delay for each loop
dtotal = dtotal + 200;
});
});