Sono un po’ confuso da questa domanda. Penso che sia perché sei confuso da promise
e delegate
. Sono infatti caratteristiche di jQuery completamente indipendenti tra loro. Spiegherò ciascuno separatamente:
delegato
delegate
è una caratteristica di jQuery che è stata introdotta in jQuery 1.4.2. (È un approccio più carino alla caratteristica live
che è stata aggiunta in jQuery 1.3). Risolve un problema particolare che si presenta con la modifica del DOM, e in particolare con le chiamate AJAX.
Quando si lega un gestore di eventi, lo si lega a una selezione. Quindi si potrebbe fare $('.special').click(fn)
per legare un gestore di eventi a tutti i membri della classe special
. Ti leghi a quegli elementi, quindi se poi rimuovi la classe da uno di quegli elementi, l’evento verrà comunque attivato. Inversamente, se si aggiunge la classe ad un elemento (o si aggiunge un nuovo elemento nel DOM), questo non avrà l’evento legato.
C’è una caratteristica di Javascript che mitiga questo chiamato “event bubbling”. Quando un evento viene innescato, prima il browser notifica l’elemento da cui l’evento ha avuto origine. Poi risale l’albero DOM e notifica ogni elemento antenato. Questo significa che si può legare un gestore di eventi su un elemento in alto nell’albero DOM, e gli eventi si attivano su ogni elemento figlio (anche quelli che non esistono quando il gestore è stato legato).
delegate
è l’implementazione di jQuery di questo. Prima si seleziona un elemento padre. Poi si specifica un selettore – il gestore sarà eseguito solo se l’elemento di origine corrisponde a questo selettore. Poi si specifica un tipo di evento, come click
, submit
, keydown
, proprio come con bind
. Infine si specifica il gestore dell’evento.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
è un’altra aggiunta relativamente recente alle caratteristiche di jQuery. Fa parte del concetto Deferred
che è stato introdotto in jQuery 1.5. (Penso che la somiglianza di suono tra “deferred” e “delegate” sia probabilmente la fonte di confusione). Questo è un modo di astrarre le complicazioni del codice asincrono. Il miglior esempio di questo è con le chiamate AJAX, poiché l’oggetto restituito da $.ajax
è un oggetto Deferred
. Per esempio:
$.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});
Quindi è in molti modi la stessa cosa che legare gestori di successo nella chiamata $.ajax
, eccetto che potete legare più di un gestore, e potete legarli dopo la chiamata iniziale.
Un altro momento in cui sarebbe utile trattare in modo asincrono è con le animazioni. Si possono fornire callback alle funzioni, ma sarebbe più bello farlo con una sintassi simile all’esempio AJAX che ho fornito sopra.
In jQuery 1.6, questa funzionalità è stata resa possibile, e promise
è parte di questa implementazione. Chiamate promise
su una selezione jQuery, e otterrete un oggetto a cui potete legare i gestori di eventi, quando tutte le animazioni nell’oggetto hanno completato.
Per esempio:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Ancora una volta, questo è simile in effetti ai metodi tradizionali, ma aggiunge flessibilità. Potete legare i gestori in seguito, e potete legarne più di uno.
Sommario
Fondamentalmente, non c’è una relazione significativa tra delegate
e promise
, ma sono entrambe caratteristiche utili nella moderna jQuery.