J'ai lu quelques articles ici et ailleurs sur le Web sur les différences entre live()
et delegate()
. Cependant, je n'ai pas trouvé la réponse que je cherche (si c'est une dupe, dites-le moi).
Je sais que la différence entre live
et delegate
est que live
ne peut pas être utilisé dans une chaîne. J'ai également lu quelque part que delegate
est dans certains cas plus rapide (meilleure performance).
Ma question est la suivante: y a-t-il une situation où vous devriez utiliser live
au lieu de delegate
?
[~ # ~] mise à jour [~ # ~]
J'ai mis en place un test simple pour voir la différence de performance.
J'ai également ajouté la nouvelle .on()
qui est disponible dans jQuery 1.7+
Les résultats résument à peu près les problèmes de performances comme indiqué dans les réponses.
.live()
sauf si votre version de jQuery ne prend pas en charge .delegate()
..delegate()
sauf si votre version de jQuery ne prend pas en charge .on()
.La différence entre .live()
et .delegate()
est BEAUCOUP plus grande qu'entre delegate()
et .on()
.
Je n'utilise jamais live
; Je considère que les avantages de l'utilisation de delegate
sont tellement importants qu'ils sont accablants.
Le seul avantage de live
est que sa syntaxe est très proche de celle de bind
:
$('a.myClass').live('click', function() { ... });
delegate
, cependant, utilise une syntaxe légèrement plus verbeuse:
$('#containerElement').delegate('a.myClass', 'click', function() { ... });
Cela me semble cependant beaucoup plus explicite sur ce qui se passe réellement. Vous ne vous rendez pas compte de l'exemple live
que les événements sont réellement capturés sur document
; avec delegate
, il est clair que la capture d'événement se produit le #containerElement
. Vous pouvez faire la même chose avec live
, mais la syntaxe devient de plus en plus horrible.
La spécification d'un contexte pour vos événements à capturer améliore également les performances. Avec l'exemple live
, chaque clic sur l'ensemble du document doit être comparé avec le sélecteur a.myClass
pour voir si cela correspond. Avec delegate
, ce ne sont que les éléments dans #containerElement
. Cela améliorera évidemment les performances.
Enfin, live
nécessite que votre navigateur recherche a.myClass
qu'elle existe ou non actuellement . delegate
ne recherche les éléments que lorsque les événements sont déclenchés, ce qui donne un avantage supplémentaire en termes de performances.
NB delegate
utilise live
en arrière-plan, vous pouvez donc faire avec live
tout ce que vous pouvez faire avec delegate
. Ma réponse les traite car ils sont couramment utilisés.
Notez également que ni live
ni delegate
n'est le meilleur moyen de faire la délégation d'événements dans jQuery moderne. La nouvelle syntaxe (à partir de jQuery 1.7) est avec la fonction on
. La syntaxe est la suivante:
$('#containerElement').on('click', 'a.myClass', function() { ... });
Ils sont exactement les mêmes sauf:
.delegate()
vous permet de réduire la section locale de la page, tandis que .live()
doit traiter les événements dans la page entière..live()
commence par une sélection DOM gaspilléeLorsque vous appelez .delegate()
, il se retourne simplement et appelle .live()
, mais transmet le paramètre de contexte supplémentaire .
https://github.com/jquery/jquery/blob/master/src/event.js#L948-95
En tant que tel, j'utiliserais toujours .delegate()
. Si vous en avez vraiment besoin pour traiter tous les événements de la page, donnez-lui simplement le body
comme contexte.
$(document.body).delegate('.someClass', 'click', function() {
// run handler
});
Les anciennes versions de jQuery ont en fait la fonctionnalité delegate
. Vous avez juste besoin de passer un sélecteur ou un élément comme propriété de contexte lors de l'appel de .live()
. Bien sûr, il doit être chargé sur la page.
$('.someClass', '#someContainer').live('click',function() { // run handler });
Et vous avez le même comportement que .delegate()
.
Deux situations me viennent à l'esprit:
Vous utiliseriez delegate
sur l'élément body
, donc vous pouvez simplement utiliser live
à la place car c'est plus simple.
Vous devez utiliser une ancienne version de la bibliothèque jQuery, où l'événement delegate
n'est pas encore implémenté.
Considérez cet exemple
<ul id="items">
<li> Click Me </li>
</ul>
$('#items').delegate('li', 'click', function() {
$(this).parent().append('<li>New Element</li>');
});
En passant un élément DOM comme contexte de notre sélecteur, nous pouvons faire en sorte que Live () se comporte (presque) de la même manière que delegate (). Il attache le gestionnaire au contexte, pas au document - qui est le contexte par défaut. Le code ci-dessous est équivalent à la version delegate () illustrée ci-dessus.
$("li", $("#items")[0]).live("click", function() {
$(this).parent().append("<li>New Element</li>");
});
Mais, vous feriez mieux d'utiliser délégué pour de meilleures performances voir ici