Jestem trochę zdezorientowany tym pytaniem. Myślę, że dzieje się tak dlatego, że jesteś zdezorientowany przez promise
i delegate
. Są to w rzeczywistości zupełnie niepowiązane funkcje jQuery. Wyjaśnię każdy z nich osobno:
delegat
delegate
jest funkcją jQuery, która została wprowadzona w jQuery 1.4.2. (Jest to ładniejsze podejście do funkcji live
, która została dodana w jQuery 1.3). Rozwiązuje ona szczególny problem związany z modyfikacją DOM, a zwłaszcza z wywołaniami AJAX.
Gdy wiążesz obsługę zdarzeń, wiążesz ją z wyborem. Możesz więc zrobić $('.special').click(fn)
, aby powiązać obsługę zdarzeń ze wszystkimi członkami klasy special
. Wiążesz się z tymi elementami, więc jeśli następnie usuniesz klasę z jednego z tych elementów, zdarzenie nadal będzie wywoływane. I odwrotnie, jeśli dodasz klasę do elementu (lub dodasz nowy element do DOM), nie będzie on miał powiązanego zdarzenia.
Istnieje cecha Javascript, która łagodzi to zjawisko zwane „bąbelkowaniem zdarzeń”. Kiedy zdarzenie jest wyzwalane, najpierw przeglądarka powiadamia element, z którego pochodzi zdarzenie. Następnie przechodzi w górę drzewa DOM, i powiadamia każdy element przodka. Oznacza to, że można powiązać obsługę zdarzenia z elementem znajdującym się wysoko w drzewie DOM, a zdarzenia wyzwalane są na wszystkich elementach potomnych (nawet tych, które nie istnieją, gdy obsługa została powiązana).
delegate
jest implementacją tego w jQuery. Po pierwsze, wybierasz element nadrzędny. Następnie określasz selektor – handler zostanie uruchomiony tylko wtedy, gdy element pochodzący pasuje do tego selektora. Następnie określasz typ zdarzenia, taki jak click
, submit
, keydown
, tak samo jak w przypadku bind
. Następnie na koniec określasz obsługę zdarzenia.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
jest kolejnym stosunkowo niedawnym dodatkiem do zestawu funkcji jQuery. Jest to część koncepcji Deferred
, która została wprowadzona w jQuery 1.5. (Myślę, że podobieństwo w dźwięku między „deferred” i „delegatem” jest prawdopodobnie źródłem zamieszania). Jest to sposób na wyabstrahowanie komplikacji związanych z kodem asynchronicznym. Najlepszym tego przykładem są wywołania AJAX, ponieważ obiekt zwracany przez $.ajax
jest obiektem Deferred
. Na przykład:
$.ajax({ url: 'somepage.cgi', data: {foo: 'bar'}}).done(function() { // this will be run when the AJAX request succeeds}).fail(function() { // this will be run when the AJAX request fails}).always(function() { // this will be run when the AJAX request is complete, whether it fails or succeeds}).done(function() { // this will also be run when the AJAX request succeeds});
Więc jest to pod wieloma względami to samo, co wiązanie handlerów sukcesu w wywołaniu $.ajax
, z wyjątkiem tego, że możesz wiązać więcej niż jeden handler, i możesz wiązać je po początkowym wywołaniu.
Innym czasem, kiedy przydatne byłoby radzenie sobie asynchronicznie, są animacje. Możesz dostarczyć wywołania zwrotne do funkcji, ale byłoby ładniej zrobić to z podobną składnią do przykładu AJAX, który podałem powyżej.
W jQuery 1.6, ta funkcjonalność została umożliwiona, a promise
jest częścią tej implementacji. Wywołujesz promise
na selekcji jQuery, a otrzymasz obiekt, do którego możesz powiązać obsługę zdarzeń, gdy wszystkie animacje w obiekcie zostały zakończone.
Na przykład:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Znowu, jest to podobne w skutkach do tradycyjnych metod, ale dodaje elastyczność. Możesz powiązać handlery później i możesz powiązać więcej niż jeden.
Podsumowanie
Podstawowo, nie ma znaczącego związku między delegate
i promise
, ale oba są użytecznymi funkcjami w nowoczesnym jQuery.