2015-05-08 7 views
4

У меня есть ряд элементов, которые я хочу последовательно переключать внутри и снаружи. Я использую <button class="toggle"> для управления этим:Задержка() не работает, как ожидалось, внутри каждого цикла() jQuery

$('.toggle').click(function(){ 
    $('.squares span').each(function(index){ 
     $(this).delay(600*index+1).toggleClass('hide'); 
    }); 
}); 

jsFiddle: http://jsfiddle.net/r2vk7L5b/

Оказывается, что метод delay() просто игнорируется в этом цикле. Переменная index передается так же, как ожидалось. Вы можете отключить его, чтобы увидеть его как 0,1,2,3 и т. Д.

Что я здесь не понимаю о методе each() или delay()?

+4

'.delay()' работает только для очередей анимации. '.toggleClass()' не создает его. Использовать старый добрый 'setTimeout()', возможно? Кроме того, помните приоритет в базовой арифметике: умножение происходит до добавления. Вы должны использовать '600 * (index + 1)', а не '600 * index + 1'. – Terry

+1

Итак, у меня сложилось впечатление, что задержка не складывается, поэтому она переходит прямо к следующему вызову функции. Вот несколько стратегий для обходных решений. http://www.mattlunn.me.uk/blog/2012/06/jquery-delay-not-working-for-you/ –

ответ

3

toggleClass не один из JQuery-х animation (effects) functions (как fadeIn), и delay работает только с анимацией функции JQuery в. toggleClass и show и hide и несколько других основных функций) сразу, даже если есть задержки или другие эффекты, ожидающие обработки в очереди эффектов jQuery.

Для имитации delay с функцией без анимации, вы можете использовать setTimeout:

$('.toggle').click(function(){ 
    $('.squares span').each(function(index){ 
     var $this = $(this); 
     setTimeout(function() { 
      $this.toggleClass('hide'); 
     }, 600*index+1); 
    }); 
}); 

Updated Fiddle

Или поочередно, рассмотрите возможность использования функции анимации (эффектов).

+0

В моем jsFiddle вы увидите, что у меня есть класс, который скрывает элемент. Я хочу контролировать это, добавляя или удаляя класс для элементов. – invot

+1

@invot: Это то, что делает версия 'setTimeout'. Он делает именно то, что сделала бы ваша версия 'delay', если' toggleClass' были одной из функций анимации jQuery. –

+0

Я не знал о том, что «toggleClass» не является эффектом анимации. Я не знал, что 'delay()' работает только с ними. – invot

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