Je voudrais ajouter quelques remarques et contre-arguments à la réponse de jfriend00. (principalement juste mes opinions basées sur mon instinct)
Non - vous ne devriez PAS lier tous les gestionnaires d'événements délégués à l'objet document. C'est probablement le scénario le moins performant que vous pourriez créer.
Tout d'abord, la délégation d'événements ne rend pas toujours votre code plus rapide. Dans certains cas, c'est avantageux et dans d'autres cas non. Vous devriez utiliser la délégation d'événements lorsque vous en avez réellement besoin et que vous en bénéficiez. Sinon, vous devriez lier directement les gestionnaires d'événements aux objets où l'événement se produit car cela sera généralement plus efficace.
Il est vrai que la performance pourrait être légèrement meilleure si vous ne devez enregistrer un événement que pour un seul élément, mais je crois que cela ne dépasse pas les avantages de la scalabilité apportée par la délégation. Je crois aussi que les navigateurs gèrent cela de manière de plus en plus efficace, bien que je n'ai pas de preuve de cela. À mon avis, la délégation d'événements est la voie à suivre !
Deuxièmement, vous ne devriez PAS lier tous les événements délégués au niveau du document. C'est précisément pourquoi .live() a été abandonné car c'est très inefficace lorsque vous avez beaucoup d'événements liés de cette manière. Pour la gestion des événements délégués, il est BEAUCOUP plus efficace de les lier au parent le plus proche qui n'est pas dynamique.
Je suis plutôt d'accord avec cela. Si vous êtes sûr à 100% qu'un événement se produira uniquement à l'intérieur d'un conteneur, il est logique de lier l'événement à ce conteneur, mais je serais toujours contre le fait de lier les événements directement à l'élément déclencheur.
Troisièmement, tous les événements ne fonctionnent pas et tous les problèmes ne peuvent pas être résolus avec la délégation. Par exemple, si vous souhaitez intercepter des événements de touche sur un contrôle de saisie et bloquer les touches invalides d'être saisies dans le contrôle de saisie, vous ne pouvez pas le faire avec la gestion des événements délégués car au moment où l'événement remonte à l'agent délégué, il a déjà été traité par le contrôle de saisie et il est trop tard pour influencer ce comportement.
Ce n'est tout simplement pas vrai. Veuillez consulter ce codePen : https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
Cela illustre comment vous pouvez empêcher un utilisateur de taper en enregistrant l'événement keypress sur le document.
Voici des moments où la délégation d'événements est nécessaire ou avantageuse :
Lorsque les objets sur lesquels vous capturez des événements sont créés/supprimés dynamiquement et que vous souhaitez toujours capturer des événements sur eux sans avoir à réenregistrer explicitement les gestionnaires d'événements à chaque fois que vous en créez un nouveau. Lorsque vous avez beaucoup d'objets qui veulent tous le même gestionnaire d'événements exact (où beaucoup est au moins des centaines). Dans ce cas, il peut être plus efficace au moment de la configuration de lier un gestionnaire d'événements délégué plutôt que des centaines ou plus de gestionnaires d'événements directs. Remarque, la gestion des événements délégués est toujours moins efficace à l'exécution que les gestionnaires d'événements directs.
J'aimerais répondre avec cette citation de https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c
La délégation d'événements favorise la liaison du moins de gestionnaires d'événements DOM possible, car chaque gestionnaire d'événements nécessite de la mémoire. Par exemple, imaginons que nous avons une liste HTML non ordonnée à laquelle nous voulons lier des gestionnaires d'événements. Au lieu de lier un gestionnaire d'événements de clic pour chaque élément de liste (qui peut être des centaines pour tout ce que nous savons), nous lions un gestionnaire de clic à l'élément parent de la liste non ordonnée elle-même.
De plus, en cherchant sur coût de performance de la délégation d'événements google
retourne plus de résultats en faveur de la délégation d'événements.
Lorsque vous essayez de capturer (à un niveau supérieur dans votre document) des événements qui se produisent sur n'importe quel élément dans le document. Lorsque votre conception utilise explicitement la propagation d'événements et stopPropagation() pour résoudre un problème ou une fonctionnalité sur votre page. Pour mieux comprendre cela, il faut comprendre comment fonctionnent les gestionnaires d'événements délégués de jQuery. Lorsque vous appelez quelque chose comme cela :
$("#myParent").on('click', 'button.actionButton', myFn); Il installe un gestionnaire d'événements jQuery générique sur l'objet #myParent. Lorsqu'un événement de clic remonte à ce gestionnaire d'événements délégué, jQuery doit passer en revue la liste des gestionnaires d'événements délégués attachés à cet objet et voir si l'élément d'origine de l'événement correspond à l'un des sélecteurs dans les gestionnaires d'événements délégués.
Parce que les sélecteurs peuvent être assez complexes, cela signifie que jQuery doit analyser chaque sélecteur puis le comparer aux caractéristiques de la cible d'événement originale pour voir s'il correspond à chaque sélecteur. Ce n'est pas une opération bon marché. Ce n'est pas un gros problème s'il y en a seulement un, mais si vous placez tous vos sélecteurs sur l'objet document et qu'il y avait des centaines de sélecteurs à comparer à chaque événement remonté, cela peut sérieusement commencer à entraver la performance de la gestion des événements.
Pour cette raison, vous voulez configurer vos gestionnaires d'événements délégués de telle sorte qu'un gestionnaire d'événements délégué soit aussi proche de l'objet cible que possible. Cela signifie que moins d'événements remonteront à travers chaque gestionnaire d'événements délégué, améliorant ainsi la performance. Mettre tous les événements délégués sur l'objet document est la pire performance possible car tous les événements remontés doivent passer par tous les gestionnaires d'événements délégués et être évalués par rapport à tous les sélecteurs d'événements délégués possibles. C'est précisément pourquoi .live() est obsolète car c'est ce que .live() faisait et s'est avéré être très inefficace.
Où cela est-il documenté ? Si c'est vrai, alors jQuery semble gérer la délégation de manière très inefficace, et mes contre-arguments ne devraient s'appliquer qu'à JavaScript vanilla.
- Malgré tout : j'aimerais trouver une source officielle soutenant cette affirmation.
: ÉDITION ::
Il semble que jQuery gère en effet la propagation des événements de manière très inefficace (car ils prennent en charge IE8) https://api.jquery.com/on/#event-performance
Donc la plupart de mes arguments ici ne s'appliquent que pour JavaScript vanilla et les navigateurs modernes.
1 votes
Possible duplicate de Pourquoi ne pas pousser la délégation d'événements Javascript à l'extrême?