2012-06-17 7 views
0

У меня есть эта функция, которую я хотел бы конденсировать в некоторый итератор. Как можно очистить эту функцию?Как очистить эту функцию jQuery?

Все должны действовать последовательно, как в: Когда одна функция возвращается, начинается следующая. Все нечетные дети должны исчезнуть после исчезновения, и все даже дети должны исчезнуть и не исчезнуть после.

Обратите внимание: этот код написан в CoffeeScript, поэтому точки с запятой не указаны.

У меня также возникла проблема после 8-го ребенка (например, если я продолжу «.title-меч: nth-child (9) и т. Д.), Функция перестает работать. Мое мышление заключается в том, что для встроенных функций есть предел, но я не могу это проверить.

$('.title-sword:nth-child(2)').css('visibility', 'visible').hide().fadeIn('fast').fadeOut('fast', -> 
    $('.title-sword:nth-child(3)').css('visibility', 'visible').hide().fadeIn('fast', -> 
     $('.title-sword:nth-child(4)').css('visibility', 'visible').hide().fadeIn('fast').fadeOut('fast', -> 
      $('.title-sword:nth-child(5)').css('visibility', 'visible').hide().fadeIn('fast', -> 
       $('.title-sword:nth-child(6)').css('visibility', 'visible').hide().fadeIn('fast').fadeOut('fast', -> 
        $('.title-sword:nth-child(7)').css('visibility', 'visible').hide().fadeIn('fast', -> 
         $('.title-sword:nth-child(8)').css('visibility', 'visible').hide().fadeIn('fast').fadeOut('fast') 
        ) 
       ) 
      ) 
     ) 
    ) 
) 
+0

Вы можете легко сделать (вид) рекурсивную функцию, передав выделение и действующий индекс. Возможно, это зависит от вашей фактической разметки. Я бы избегал использовать '.title-sword: nth-child (X)' снова и снова, если вы можете просто получить доступ к X -му выбранному элементу. –

+1

Что-то не так с регулярным циклом? – Niko

+0

@Niko: нормальный цикл не ждет анимации. Я не думаю, что это возможно вообще. –

ответ

1

Попробуйте что-то вроде этого (не CoffeeScript, так как я просто обычный парень JS):

(function() { 
    var i=2, elm, 
     step = function() { 
      elm = $('.title-sword:nth-child('+i+')'); 
      if(!elm) return; 
      elm.css('visibility','visible').hide(); 
      if(i%2 == 0) elm.fadeIn('fast').fadeOut('fast',step); 
      else elm.fadeIn('fast',step); 
      i++; 
     }; 
    step(); 
})(); 

Этот код будет запускать желаемую функцию, начиная со второго ребенка, и повторять до тех пор, пока не будет больше chil тей.

+0

'! Elm' должно быть'! Elm.length' – charlietfl

+0

@charlietfl Почему? Если 'elm' равно null, попытка получить' elm.length' вызовет ошибку. –

+0

'elm' никогда не будет пустым, так как функция' $() 'будет - при передаче селектора - всегда возвращает объект jQuery (но, возможно,« пустой »с' .length' 0). – nnnnnn

0

Предполагая, что элементы все братья и сестры, это должно работать:

function doFades($el){ 
    $el.css('visibility', 'visible').hide().fadeIn('fast').fadeOut('fast', function(){ 
      var $next=$(this).next(); 
      if($next.length){ 
       doFades($next); 
      } 
    }); 
} 

doFades($('.title-sword:nth-child(2)')); 

Я не знаком с CoffeeScript синтаксиса, но должно быть легко изменить

0

Я предпочитаю, чтобы запустить операцию выбора только один раз и затем перебираем результаты. Вот общая функция, которая может быть использована для вашей цели:

fadeInOutChildren(parentSelector, lowChild, highChild) { 
    var items = $(parentSelector).children(); 
    var index = lowChild; 

    function next() { 
     if (index <= highChild) { 
      items.eq(index++).css('visibility', 'visible').hide().fadeIn('fast').fadeOut('fast', next); 
     } 
    } 
    next(); 
} 

fadeInOutChildren(".title-sword", 1, 7); 
Смежные вопросы