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 devez 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 puissiez 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 certains cas non. Vous devez utiliser la délégation d'événements lorsque vous avez réellement besoin d'une délégation d'événements et lorsque vous en bénéficiez. Sinon, vous devez lier les gestionnaires d'événements directement aux objets où l'événement se produit, car cela sera généralement plus efficace.
Bien qu'il soit vrai que les performances pourraient être légèrement meilleures si vous ne vous enregistrez et n'organisez un événement que pour un seul élément, je pense que cela ne compense pas les avantages d'évolutivité que la délégation apporte. Je pense également que les navigateurs vont (vont) gérer cela de plus en plus efficacement, même si je n'en ai aucune preuve. À mon avis, la délégation d'événements est la voie à suivre!
Deuxièmement, vous ne devez PAS lier tous les événements délégués au niveau du document. C'est exactement pourquoi .live () est obsolète car c'est très inefficace lorsque de nombreux événements sont liés de cette façon. Pour la gestion déléguée des événements, il est BEAUCOUP plus efficace de les lier au parent le plus proche qui n'est pas dynamique.
Je suis plutôt d'accord là-dessus. Si vous êtes sûr à 100% qu'un événement ne se produira qu'à l'intérieur d'un conteneur, il est logique de lier l'événement à ce conteneur, mais je serais toujours contre la liaison d'événements à l'élément déclencheur directement.
Troisièmement, tous les événements ne fonctionnent pas ou tous les problèmes peuvent être résolus par délégation. Par exemple, si vous souhaitez intercepter des événements clés sur un contrôle d'entrée et empêcher la saisie de clés non valides dans le contrôle d'entrée, vous ne pouvez pas le faire avec la gestion des événements déléguée, car au moment où l'événement remonte au gestionnaire délégué, il a déjà été traité par le contrôle d'entrée 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();
});
Il illustre comment vous pouvez empêcher un utilisateur de taper en enregistrant l'événement keypress sur le document.
Voici les moments où la délégation d'événements est requise 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 à relier explicitement les gestionnaires d'événements chaque fois que vous en créez un nouveau. Lorsque vous avez beaucoup d'objets qui veulent tous exactement le même gestionnaire d'événements (où lots vaut au moins des centaines). Dans ce cas, il peut être plus efficace au moment de l'installation de lier un gestionnaire d'événements délégué plutôt que des centaines ou plus de gestionnaires d'événements directs. Notez que la gestion des événements délégués est toujours moins efficace au moment de l'exécution que les gestionnaires d'événements directs.
Je voudrais répondre avec cette citation de https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c
Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.
De plus, rechercher sur Google performance cost of event delegation google
renvoie 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 du document. Lorsque votre conception utilise explicitement le bullage d'événements et stopPropagation () pour résoudre un problème ou une fonctionnalité de votre page. Pour comprendre un peu plus cela, il faut comprendre comment fonctionnent les gestionnaires d'événements délégués jQuery. Lorsque vous appelez quelque chose comme ça:
$ ("# 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 atteint ce gestionnaire d'événements délégué, jQuery doit parcourir 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.
Étant donné que les sélecteurs peuvent être assez impliqués, cela signifie que jQuery doit analyser chaque sélecteur, puis le comparer aux caractéristiques de la cible d'événement d'origine pour voir s'il correspond à chaque sélecteur. Ce n'est pas une opération bon marché. Ce n'est pas grave s'il n'y en a qu'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 à bulles, cela peut sérieusement commencer à entraver les performances de gestion des événements.
Pour cette raison, vous souhaitez configurer vos gestionnaires d'événements délégués afin qu'un gestionnaire d'événements délégués soit aussi proche que possible de l'objet cible. Cela signifie que moins d'événements apparaîtront dans chaque gestionnaire d'événements délégué, améliorant ainsi les performances. Placer tous les événements délégués sur l'objet document est la pire performance possible, car tous les événements à bulles 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 exactement pourquoi .live () est obsolète car c'est ce que faisait .live () et il s'est avéré très inefficace.
Où est-ce 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 être appliqués qu'à vanilla JS.
Pourtant: j'aimerais trouver une source officielle soutenant cette affirmation.
:: ÉDITER ::
On dirait que jQuery fait effectivement des bulles d'é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 sont valables que pour JS vanilla et les navigateurs modernes.