2010-05-10 9 views
10

co jest nie tak w tym kodzie? Próbuję uzyskać ten efekt: fadeOut(500) i attr('class','myClass') opóźniony o 600 mil .. następnie delay(600) ponownie i fadeIn(500). Opóźnienia zdarzają się poprawnie, ale attr() nie jest opóźniony, strzela, gdy #myDiv nadal zanika! :. (delay() i fadeOut() nie opóźniają attr() w kolejce

$('#myDiv').fadeOut(500) 
      .delay(600) 
      .attr('class','myClass') 
      .delay(600) 
      .fadeIn(500); 

Odpowiedz

25

.delay() wpływa tylko animację lub fx kolejkę (chyba że podasz inną kolejkę specjalnie) Należy pamiętać, że łańcuchowym i kolejek są 2 wyraźnie różne pojęcia, łańcuchowym kontynuuje wykorzystanie tego samego jQuery ustawić, ale to inna sprawa całkowicie od wszelkich kolejek zdarzeń dotyczących elementów tego zestawu

aby mieć połączenie .attr() dotknięte, trzeba dodać ją jako zwrotnego do tej samej kolejki przy użyciu .queue() coś takiego:.

$('#myDiv').fadeOut(500) 
      .delay(600) 
      .queue(function(next) { $(this).attr('class','myClass'); next(); }) 
      .delay(600) 
      .fadeIn(500); 

Należy również pamiętać, istnieją .addClass(), .removeClass() i .toggleClass() dostępnych metod, które mogą uczynić to nieco czystsze :)

+1

myślę, że należy zadzwonić '$ (this) .dequeue()' wewnątrz funkcji. Z dokumentacji: * Zauważ, że dodając funkcję z .queue(), powinniśmy upewnić się, że .dequeue() jest ostatecznie wywoływana tak, że wykonywana jest następna funkcja w linii. * W każdym razie +1;) –

+0

@Felix - Woops I ' zazwyczaj nazywa się to jako ostatni element w kolejce, dobry połów :) –

+0

Cześć Nick, dziękuję za odpowiedź. Działa tak jak mówisz, jednak następujące połączenia w kolejce już nie działają ... :( EDIT zobaczył tylko teraz komentarz Feliksa .. Wielkie dzięki dla was obu – Luca