Je suis un peu confus par cette question. Je pense que c'est parce que vous êtes confus par promise
et delegate
. Ils sont en fait complètement sans rapport avec les fonctionnalités de jQuery. Je vais vous expliquer chacun séparément:
delegate
delegate
est une fonction jQuery qui a été introduit dans jQuery 1.4.2. (C'est une belle approche de l' live
fonctionnalité qui a été ajoutée dans jQuery 1.3). Il résout un problème particulier qui vient avec la modification du DOM, et en particulier avec des appels AJAX.
Lorsque vous liez un gestionnaire d'événements, de vous lier à une sélection. Donc, vous pourriez ne $('.special').click(fn)
de lier un gestionnaire d'événements pour tous les membres de l' special
classe. Vous lier à ces éléments, de sorte que si vous supprimez ensuite la classe de l'un de ces éléments, l'événement sera encore déclenchée. Inversement, si vous ajoutez la classe d'un élément (ou d'ajouter un nouvel élément dans le DOM), il n'aura pas le cas liée.
Il n'y est une fonction Javascript qui atténue ce qu'on appelle "remontée d'événements". Lorsqu'un événement est déclenché, le premier navigateur informe l'élément à l'origine de l'événement. Ensuite, il va jusqu'à l'arbre du DOM, et notifie à chaque élément ancêtre. Cela signifie que vous pouvez lier un gestionnaire d'événement sur un élément en haut de l'arborescence DOM, et des événements déclenchés sur tous les éléments enfants (même ceux qui n'existent pas lorsque le gestionnaire est lié).
delegate
jQuery est de la mise en œuvre de cette. Tout d'abord, vous sélectionnez un élément parent. Ensuite, vous spécifiez un sélecteur – le gestionnaire sera exécutée uniquement si l'origine de l'élément correspond à ce sélecteur. Ensuite, vous spécifiez un type d'événement, comme click
, submit
, keydown
, tout comme l' bind
. Puis, finalement, vous spécifiez le gestionnaire d'événements.
$('#containingElement').delegate('a.special', 'click', function() {
alert('This will happen on all links with the special class');
});
promise
promise
est un autre ajout relativement récent à la jQuery featureset. Il fait partie de l' Deferred
concept qui a été introduit dans jQuery 1.5. (Je pense que la similitude de son entre les "différé" et "délégué" est probablement la source de la confusion.) C'est une façon d'abstraction les complications du code asynchrone. Le meilleur exemple de ceci est avec des appels AJAX, comme l'objet renvoyé par $.ajax
est Deferred
objet. Par exemple:
$.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
});
C'est donc à bien des égards la même que la liaison de la réussite des gestionnaires dans l' $.ajax
d'appel, sauf que vous pouvez lier plus d'un gestionnaire, et vous pouvez les lier après l'appel initial.
Une autre fois, quand il serait utile de traiter de manière asynchrone est avec des animations. Vous pouvez fournir des rappels pour les fonctions, mais il serait encore mieux de le faire avec la même syntaxe que l'AJAX exemple que j'ai fourni ci-dessus.
En jQuery 1.6, cette fonctionnalité a été rendu possible, et promise
fait partie de cette mise en œuvre. Vous appelez promise
sur un jQuery sélection, et vous obtiendrez un objet que vous pouvez lier des gestionnaires d'événements, lorsque toutes les animations à l'objet réalisé.
Par exemple:
$('div.special').fadeIn(5000).promise().then(function() {
// run when the animation succeeds
}).then(function() {
// also run when the animation succeeds
});
Encore une fois, cela a des effets semblables à des méthodes traditionnelles, mais il ajoute de la souplesse. Vous pouvez lier les gestionnaires plus tard, et vous pouvez lier plus d'un.
Résumé
Fondamentalement, il n'y a aucune relation significative entre l' delegate
et promise
, mais ils sont tous les deux fonctions utiles dans moderne jQuery.