2012-02-16 13 views
7

Dla jQuery, jaka jest różnica w wyniku następujących dwóch fragmentów kodu. Byle co? Czy poprawiam, że wywołanie zwrotne i drugi element w łańcuchu są wykonywane po ukończeniu pierwszej animacji?Jquery Chaining vs Callbacks

$(selector).animate({ opacity: 1 }).animate({ opacity: 0.5 }); 

vs

$(selector).animate({ opacity: 1}, function() 
{ 
    $(this).animate({ opacity: 0.5 }); 
}); 

w jaki typu (-ów) sytuacji chciałbym używać jednego nad drugim? Czy używałbym tego ostatniego tylko wtedy, gdy potrzebowałbym czegoś bardziej wyrafinowanego lub przejść na inny selektor?

Z góry dziękuję.

+0

Tak samo szybko oceniam, że pierwszy byłby bardziej wydajny, ponieważ nie trzeba rzutować $ (this) jako obiektu jQuery, a następnie wywoływać animację na nim. Prawdopodobnie chcesz użyć drugiej opcji, jeśli musisz robić bardziej skomplikowane rzeczy. Edycja: Widzę, że nie szukasz skuteczności, uważałbym, że obie funkcje są takie same, ponieważ w pierwszym przypadku animate musiałoby powrócić przed drugim wywołaniem. – kand

+0

jQuery zarządzaj animacjami, umieszczając je w kolejce, aby druga animacja nie została wykonana, dopóki nie zakończy się pierwsza. Dotyczy to tylko animacji. Zobacz przykład na http://api.jquery.com/queue/ – Stefan

+0

@Stefan Moce. Czy to, co mówisz, odnosi się do czegokolwiek wymienionego tutaj? [Efekty jQuery] (http://api.jquery.com/category/effects/) – technoTarek

Odpowiedz

9

Są one praktycznie takie same, więc prawdopodobnie użyjesz pierwszego.

Połączenia zwrotne (druga wersja) służą do uruchamiania dowolnego kodu, który nie jest automatycznie umieszczany w kolejce.

Obejmuje to na przykład inne metody jQuery, takie jak .css(), które, jeśli nie występują w wywołaniu zwrotnym, będą działać długo przed ukończeniem animacji.

// .animate() is automatically queued 
$(selector).animate({ opacity: 1 }).animate({ opacity: 0.5 }); 

// .css() is not automatically queued, so you'd need a callback 
$(selector).animate({ opacity: 1 }, function() { 
    $(this).css({ opacity: 0.5 }); 
}); 

Bez zwrotnego ...

// Animation starts ----v 
$(selector).animate({ opacity: 1 }).css({ opacity: 0.5 }); 
// ...but .css() runs immediately-------------^ 
// ...because it isn't automatically added to the queue. 
+1

Dobre wyjaśnienie, właśnie patrzyłem na źródło jQuery i jesteś poprawny proszę pana! – Loktar

0

Jedyną różnicą jest termin: zwrotna w drugim przykładzie nie będzie wykonywana, aż ukończy pierwszy ożywione . Zakotwiczony animator w pierwszym przykładzie stanie się natychmiast po rozpoczęciu pierwszej animacji.

+0

http://jsfiddle.net/loktar/MJmgP/ nie wydaje się być w tym przypadku:? – Loktar

+0

@Rory Początkowo sądziłem, że taktowanie się różniło, ale potem przeczytałem to na jQuery.com: Każdy element może mieć od jednej do wielu kolejek funkcji dołączonych do niego przez jQuery. W większości aplikacji używana jest tylko jedna kolejka (zwana fx). Kolejki umożliwiają asynchroniczną wywoływanie sekwencji działań na elemencie, bez zatrzymywania wykonywania programu ... Na przykład: '$ ('# foo'). SlideUp().fadeIn(); ' Po wykonaniu tej instrukcji, element natychmiast rozpoczyna animację przesuwania, ale przejście zanikające jest umieszczane w kolejce fx do wywołania dopiero po zakończeniu przesuwania. – technoTarek

+0

@technoTarek to jest bardzo interesujące, czy masz link do leniwych osób (takich jak ja)? – jbabey