2013-02-27 15 views
9

Czy jest jakaś różnica jeśli robię:Jak określić, który z nich należy użyć - next(); lub dequeue() ;?

$queue.queue(function(next){ 
    //... 
    next(); 
}).queue(function(next){ 
    //... 
    next(); 
}); 

kontra

$queue.queue(function(){ 
    //... 
    $(this).dequeue(); 
}).queue(function(){ 
    //... 
    $(this).dequeue(); 
}); 

robią to samo?

Jakie są różnice i z których należy korzystać?

To dziwne przyczyną docs jQuery naprawdę nie wspominając .next(), mówią zawsze używać .dequeue() ale w moim miejscu pracy ludzie używają funkcji .next() tak to ma mnie raczej zdezorientowany.

+0

Jak to jest pytanie [tag: optymalizacja]? – millimoose

+0

Co to jest "next()" jest udokumentowane w [dokumentach dla '.queue()'] (http://api.jquery.com/queue/#queue2): "Od wersji jQuery 1.4 funkcja, która jest Wywoływana funkcja przekazuje następną funkcję jako pierwszy.Po wywołaniu, automatycznie usuwa kolejkę kolejnych elementów i powoduje, że kolejka się porusza. " – millimoose

+0

Dodałem optymalizację, ponieważ stwierdza ona, że ​​optymalizacja jest udoskonaleniem metody lub projektu. Szukam najlepszej metody użycia tych funkcji, dlatego też szukam "optymalizacji" mojego kodu ... Sprawia, że ​​w 100% mam sens! – Epik

Odpowiedz

7

Z tego, co wiem, nie ma różnicy. Nie jestem pewien, dlaczego jeden byłby lepszy od drugiego lub dlaczego oba zostały wymienione, ponieważ jest to mylące dla mnie.

Patrząc na http://code.jquery.com/jquery-1.9.1.js widzimy:

1915 next = function() { 
     jQuery.dequeue(elem, type); 
    }; 

... w metodzie jQuery.dequeue. Nazywa się to nieco później (w linii 1936) jako fn.call(elem, next, hooks). Zobaczysz, że next jest pierwszym parametrem w wywołaniu zwrotnym queue, a w tym czasie jest to fn.

Patrząc w przyszłość, widzimy

1983 dequeue: function(type) { 
     return this.each(function() { 
      jQuery.dequeue(this, type); 
     }); 
    }, 

ta jest określona na jQuery.fn, więc jest to funkcja wywoływana przez $(this).dequeue. Jednak robi to dokładnie to samo. Jedyną różnicą jest element, który jest odrywany. W wersji fn.dequeue pętle przechodzą przez kolekcję, ale będzie to tylko jeden element dla $(this).

Jeśli spojrzymy wstecz, widzimy, co elem jest jednak:

1908 dequeue: function(elem, type) { 

... hej, poczekaj sekundę .. to this (gdy wywołana z $(this).dequeue)! W ten sposób widać, że robią dokładnie to samo. $("some other collection").dequeue będzie jednak działać inaczej.

Zadzwoń pod numer next(), aby zapisać dodatkowe wywołanie .each, więc myślę, że będzie to szybsze.

Przy okazji, nie musisz nazywać go next w oddzwonieniu, ponieważ możesz zmieniać nazwy parametrów na dowolne.

EDIT: Na moim mini dyskusji z moim znakomitym kolegą @ FabrícioMatté, nie może być w rzeczywistości różnica w funkcjonalności pomiędzy next() i $(this).dequeue(), w szczególności gdy nie przy użyciu standardowego fx kolejkę. Po utworzeniu funkcji jest ona ustawiona na wywołanie $.dequeue z typem uzyskanym z queue już, ale $.fn.dequeue przyjmuje typ jako argument.Jest to prawdopodobnie jeszcze większa motywacja do trzymania się z next(), chociaż nigdy nie widziałem, aby ktoś używał praktycznie nic poza standardową kolejką efektów.

+0

Bardzo dobrze wytłumaczone dziękuję. Ma to sens teraz, gdy rozplanujesz się tak, jak masz. – Epik

+0

+1 za złapanie kolejek innych niż 'fx', zredagowałem również moją odpowiedź, aby spełnić te wymagania. '=]' –

4

Obie funkcje jQuery.fn.dequeue i next są po prostu opakowaniem dla jQuery.dequeue, przekazując ten sam zestaw argumentów w obu przykładach.


(Do tej pory jak jQuery 1.9.1)

Dla następnych parametrów funkcji: type to opcjonalny parametr wskazuje kolejkę, domyślnie fx który jest kolejka domyślna animacja jQuery. element jest referencją do elementu DOM.

$.fn.dequeue:

dequeue: function(type) { 
    return this.each(function() { 
     jQuery.dequeue(this, type); 
    }); 
} 

$().dequeue prostu wywołuje $.dequeue dla każdego elementu zawartego wewnątrz obiektu jQuery.

Twój przypadek użycia $(this).dequeue() zadzwoni pod numer $.dequeue za jednym razem z początkowym odnośnikiem do elementu przez this.

Podobnie next przechodzą jedno odniesienie do $.dequeue elementu, który jest obecny element posiadający swoje kolejki z kolejki:

next = function() { 
    jQuery.dequeue(elem, type); 
}; 

Innymi słowy, są one w zasadzie takie same. next jest trochę bardziej bezpośredni, ponieważ nie ma opakowania po iteracji, dlatego next() powinno być o kilka mikrosekund szybsze niż $.fn.dequeue().

Główna różnica polega na tym, że można wywołać .dequeue() na wielu elementach, a każdy z nich zostanie usunięty, a next() jest powiązany bezpośrednio z elementem, którego kolejka jest usuwana.

Do przypadków użycia, w których w zgłoszeniu zwrotnym jest $(this).dequeue(), nie ma to znaczenia. $.fn.dequeue jest przydatny przy rozpinaniu jednego lub więcej elementów. $(this).dequeue() ma wynik równoważny niż next(), ale ten drugi zapewni w tym przypadku przyrost mikrosekund.


Jak zauważył @Explosion Pigułki w komentarzach, istnieje jeszcze jedna osobliwość gdy ma do czynienia z nie- fx kolejkach:

$(this).dequeue() bez type argumentem będzie rozkolejkowania domyślnej kolejki (fx) Kolejki wymagają więc podania nazwy jako parametru do .dequeue(), podczas gdy .next() poszukuje łańcucha zasięgu kreacji i automatycznie pobiera zakres type w zasięgu, który utworzył on obiekt funkcji next.

Dlatego podczas korzystania z nieprzestrzegania fx kolejkę, trzeba będzie podać nazwę kolejki do $().dequeue(queueIdentifier), natomiast .next() zawsze dequeue w kolejce, że zwrotna należy.

+0

Za chwilę edytowałem swoją odpowiedź, aby skomentować fakt, że '$ .fn.dequeue' przyjmuje jako argument' typ', ale 'next' jest zdefiniowane przez' type' uzyskane z powiązania 'queue'. Oznacza to, że '$ (this) .dequeue' najwyraźniej nie działa z kolejkami innymi niż 'fx' bez dodatkowego argumentu, podczas gdy' next() 'będzie. Czy to brzmi dobrze dla ciebie? –

+0

@ExplosionPills Tak, absolutnie. '$ (this) .dequeue()' bez argumentu 'type' usunie kolejkę domyślną (' fx'), więc kolejki inne niż 'fx' wymagają podania nazwy kolejki jako parametru, podczas gdy' .next() '" dziedziczy "poprzednio przekazany" typ ". Fajne miejsce. '=]' –

Powiązane problemy