Як додати паузу між кожною ітерацією jQuery .each ()?


81

Я захоплюю масив об'єктів jQuery, а потім за допомогою .each () модифікую кожен окремий jquery за допомогою масиву.

У цьому випадку я оновлюю назви класів, щоб запустити властивість -webkit-переходу для використання переходу css.

Я хотів би зробити паузу перед кожним переходом css. Я використовую наступне, але між кожним оновленням немає затримок. Натомість вони, схоже, оновлюються одразу.

function positionCards() {
  $cards = $('#gameboard .card');
  $cards.each(function() {
      setTimeout( function(){ addPositioningClass($(this)); }, 500 )
  });
}

function addPositioningClasses($card){
  $card
    .addClass('position')
}

Я сподівався, що setTimeout вирішить це, але, схоже, це не працює. Чи є спосіб зробити паузу перед кожним оновленням імені КЛАСУ кожного об’єкта?


спробуйте використовувати лапки навколо функції addPositioningClass, наприклад: setTimeout ('addPositioningClass ($ (this))', 500)
amosrivera

1
не могли б ви збільшити час очікування для кожної ітерації, скажімо 500,1000,1500 ...
Роб

Відповіді:


96

Я додав це як коментар, але тепер, коли я прочитав його правильно і відповів на власне запитання, це, мабуть, спрацює:

function positionCards() {
  var $cards = $('#gameboard .card');

  var time = 500;

  $cards.each(function() {
      setTimeout( function(){ addPositioningClass($(this)); }, time)
      time += 500;
  });
}

1
Чим ваш код відрізняється від OP? Виникла помилка сфери, оскільки addPositioningClassesне існує в контекстіsetTimeout
JohnP

@JohnP - @DA заявляє, що код працює, але що всі елементи розміщені одночасно, я не знав, що сфера дії є частиною проблеми ...
Роб

1
Я просто спробував це в скрипці, і це не працює. Можливо, я помиляюся, але я не бачу, як цей код може взагалі працювати.
JohnP

2
@JohnP - @DA сказав -> "Я використовую наступне, але між кожним оновленням немає затримки. Натомість вони, схоже, оновлюються одразу."
Роб

2
Рішення: яке також присутнє в цьому Git: gist.github.com/Zackio/7648481
Pranesh Janarthanan

49

Вибачте, що викопав стару нитку, але ця порада може бути корисною для подібних питань:

$cards.each(function(index) {
    $(this).delay(500*index).addClass('position');
});

6
Остерігайтеся, що delayце призначено лише для черги анімації, і ви не будете працювати, наприклад css()(див. Тут )
Ян Фото

20
Ви повинні використовувати .queue().dequeue()) при затримці .addClass():$(this).delay(500*index).queue(function() { $(this).children('.flipcontainer').addClass('visible').dequeue(); });
aksu

1
@aksu Вам слід скопіювати те, що у вас є, і зробити це відповіддю, оскільки воно загубилося серед коментарів, і ваша відповідь допомогла мені зробити це належним чином.
adamj

10

Якщо ви робите метод, який викликає себе кожні 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/


Мені потрібно ще трохи дослідити .push (). Я цього не знав!
DA.

3

Як щодо .delay () ?

або

function addPositioningClasses($card){
  setTimeout(function() { $card.addClass('position')}, 1000);
}

Мені це теж завжди цікаво, але на сьогоднішній день я не знайшов контексту, де цей метод можна застосувати.
Сендвіч

3
З того, що я можу сказати, delay () стосується лише анімації jQuery.
DA.

1

Якщо ви націлюєтеся лише на Safari / iOS, залежно від того, наскільки вам важливо контролювати точний час послідовностей анімації, вам слід уникати будь-якого рішення, яке передбачає таймаути JS. Немає гарантії, що анімація завершиться одночасно із затримкою часу очікування, особливо на повільних процесорах або машинах, у яких у фоновому режимі багато речей. Пізніші версії webkit (включаючи мобільне сафарі) дозволяють проводити послідовні анімаційні послідовності через @-webkit-keyframes. Webkit.org має гарне вступ до цього . Насправді це досить просто реалізувати.


Я справді націлююся лише на iOS (це додаток). Я не встановлюю хронометраж послідовності анімації, а, скоріше, час, як довго чекати, поки оновиться ім’я класу, яке, у свою чергу, ініціює перехід css на webkit.
DA.

1

Спробуйте:

function positionCards() {
  $('#gameboard .card').each(function() {
      $(this).delay(500).addClass('position');
  });
}

Буду чесним ... У мене в минулому в деяких випадках було погано поводитися $ (this) .delay (), а в інших - бездоганно. Однак це, як правило, поєднувалося з викликами анімації jQuery, а не з маніпулюванням атрибутами DOM.

Зверніть увагу, що .delay () не працює так само, як setTimeout. Для отримання додаткової інформації див . Документацію jQuery .delay () .

Наскільки мені відомо, $ (). Кожен виконується процедурно, тому наступна ітерація виклику повинна розпочатися лише після завершення попереднього.


Можливо, я помиляюся, але під час читання документації jquery, схоже, затримка зображень стосується лише затримки анімації jQuery. Я думаю, ви також маєте рацію в цьому останньому абзаці. Річ у тім, що я не затримував виклик функції, який задав клас, а скоріше затримував, коли буде встановлено клас. Отже, воно застосувало затримку до всіх 30 елементів одночасно, і всі вони потім затримали однакову кількість часу.
DA.

0

Перевірте це, добре в мене вийшло! :)

jQuery('.optiresultsul li').each(function(index) {
    jQuery(this).delay(500*index).animate({ opacity: 1 }, 500,function(){
        jQuery(this).addClass('bgchecked');
    });
});

-2

Цей код додасть встановити початкову затримку до 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;
    });
});

6
Найкраще, якщо ви додасте коментар, а не просто викинете туди код.
woot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.