2012-05-09 16 views
11

I nie wydaje się owinąć głowę wokół różnic między następujących w jQuery komórkowy:jQuery Komórka delegat vs żywo vs wiążą

$(document).live('pageshow', function(event) { 
}); 

$(document).bind('pageshow', function(event) { 
}); 

$(document).delegate("#page", "pageshow", function() { 
}); 

Jak wykonać skryptów w głowę z moich dokumentów, które różnią na niektórych stronach? Jakie metody wykorzystuję do wywoływania tych skryptów?

Aktualizacja: wersja jQuery: 1.7.1 wersja jQuery komórkowy: 1.1.0

Odpowiedz

15

można by wiązać się z „przypadku”, że strona jQuery komórkowy eksponuje, jak pageinit:

$(document).delegate('#my-page', 'pageinit', function() { 
    //this is like document.ready for this pseudo-page 
}); 

Ponieważ używasz jQuery Rdzeń 1.7.1 można użyć .on() który ma nieco innej składni:

$(document).on('pageinit', '#my-page', function() { 
    //this is like document.ready for this pseudo-page 
}); 

Wszystkie trzy swoimi metodami robić podobne rzeczy. .live() to to samo, co użycie .delegate() z document jako selekcji root, ale zostało ono zamortyzowane, więc dobrze jest przestać go używać (źródło: http://api.jquery.com/on). Używanie wartości .bind() bezpośrednio na elemencie document jest takie samo jak przy użyciu .delegate(), ale w przypadku korzystania z .bind() trzeba określić, która pseudo strona miała zdarzenie wywołane na nim w procedurze obsługi zdarzenia, a nie w wywołaniu funkcji.

Na przykład:

$(document).bind('pageshow', function() { 
    var id = $.mobile.activePage[0].id; 
    //you can use $.mobile.activePage to do work on the current page 
}); 

Ogólnie delegacja zdarzenie jest używany, gdy nie wiemy, gdy element będzie istnieć w DOM. Opiera się na wydarzeniach propagujących DOM, dopóki nie dojdą do wyboru roota (w twoim przypadku zawsze jest to element document).

Docs dla .delegate(): http://api.jquery.com/delegate

Aby uzyskać więcej ogólnych informacji na temat różnicy między tymi funkcjami, zobacz ten artykuł (czytałem go sprawdzić go pod kątem dokładności i to tuż-on): http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html

+0

Dzięki za zasoby. To jest świetne. Mam inne, nieco pokrewne pytanie. Załóżmy, że moja strona główna ma pokaz slajdów.Czy powinienem wywoływać kod pokazu slajdów w funkcji "pageinit" lub "pagehow"? – cusejuice

+1

'pagehow' będzie uruchamiany po każdym kolejnym wyświetleniu strony przez użytkownika. Na przykład wystrzeliwuje się po pierwszym wyświetleniu strony głównej, ale zostanie również zwolniony po przejściu dalej i powrocie na stronę główną. Chciałbym ustawić pokaz slajdów w programie obsługi zdarzeń 'pageinit', ale następnie zatrzymać go w procedurze obsługi zdarzeń' pagehide' i uruchomić ją w procedurze obsługi zdarzeń 'pagehow'. To zadziała dla początkowego obciążenia, ponieważ zdarzenie 'pagehow' jest wywoływane po zdarzeniu' pageinit'. – Jasper

+0

Jeśli skonfiguruję pokaz slajdów (tj. Uruchomię funkcję inicjowania pokazu slajdów) w obu programach obsługi zdarzeń 'pageinit' i' zdarzeniu 'pagehow', czy funkcja ta nie zostanie wywołana dwukrotnie? – cusejuice

0

Jest to doskonały opis: http://jquerybyexample.blogspot.com/2010/08/bind-vs-live-vs-delegate-function.html

Ale krótka odpowiedź jest taka, że ​​jeśli używasz jQuery 1.7 powinieneś rozpocząć korzystanie z nowego API na() zamiast któregokolwiek z nich: http://api.jquery.com/on/

+0

Ten artykuł jest rzeczywiście mylący. Na przykład '.live()' nie wiąże się z elementami, na które kierujesz (kiedykolwiek), wiąże się z elementem 'document' (zawsze) i sprawdza barbotowanie zdarzeń dla elementu docelowego, aby sprawdzić, czy pasuje do zaznaczenia przeszedłeś do '.live()'. Ponadto łańcuch ".live()" może być używany w łańcuchach, ale autor używa głupiego przykładu, aby pokazać coś przeciwnego. Proszę nie używać tego artykułu jako podstawy informacji o tych funkcjach. – Jasper

+1

Wypróbuj ten artykuł, znacznie lepiej: http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html – Jasper

0

Tego samego dnia miałem to samo pytanie i stwierdziłem, że artykuł ten zawiera wyraźny podział na każdy z nich.

http://jquerybyexample.blogspot.com/2010/08/bind-vs-live-vs-delegate-function.html

+0

Ten artykuł jest pełen nieprawidłowych wypowiedzi, zobacz mój komentarz na temat odpowiedzi Julie Sheffield. – Jasper

+0

Spróbuj tego artykułu, jest naprawdę dobry: http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html – Jasper