Quelle est la différence entre la propagation d'événements et la capture? Quand faut-il utiliser le bouillonnement vs la capture?
javascript
dom-events
event-bubbling
Arun P Johny
la source
la source
Réponses:
La propagation et la capture d'événements sont deux façons de propager un événement dans l'API HTML DOM, lorsqu'un événement se produit dans un élément à l'intérieur d'un autre élément et que les deux éléments ont enregistré un descripteur pour cet événement. Le mode de propagation d'événement détermine dans quel ordre les éléments reçoivent l'événement .
Avec le bouillonnement, l'événement est d'abord capturé et géré par l'élément le plus interne, puis propagé aux éléments externes.
Avec la capture, l'événement est d'abord capturé par l'élément le plus externe et propagé aux éléments internes.
La capture est également appelée "ruissellement", ce qui permet de se souvenir de l'ordre de propagation:
À l'époque, Netscape préconisait la capture d'événements, tandis que Microsoft encourageait la propagation d'événements. Les deux font partie de la norme W3C Document Object Model Events (2000).
IE <9 n'utilise que la propagation d'événements , tandis qu'IE9 + et tous les principaux navigateurs prennent en charge les deux. D'un autre côté, les performances de la propagation d'événements peuvent être légèrement inférieures pour les DOM complexes.
Nous pouvons utiliser le
addEventListener(type, listener, useCapture)
pour enregistrer les gestionnaires d'événements en mode de propagation (par défaut) ou de capture. Pour utiliser le modèle de capture, passez le troisième argument en tant quetrue
.Exemple
Dans la structure ci-dessus, supposez qu'un événement de clic s'est produit dans l'
li
élément.Dans la capture modèle, l'événement sera assurée par les
div
premiers (clic gestionnaires d'événements dans lediv
sera tout d' abord le feu), puis dans leul
, puis au dernier dans l'élément cible,li
.Dans le modèle bouillonnant, l'inverse se produira: l'événement sera d'abord géré par le
li
, puis par leul
, et enfin par l'div
élément.Pour plus d'informations, voir
Dans l'exemple ci-dessous, si vous cliquez sur l'un des éléments en surbrillance, vous pouvez voir que la phase de capture du flux de propagation d'événement se produit en premier, suivie de la phase de propagation.
Un autre exemple chez JSFiddle .
la source
useCapture
désormais supporté dans IE> = 9. sourcetriclkling
la même chose quecapturing
? Crockford en parleTrickling v. Bubbling
dans cette conversation vidéo - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB autour1 hr 5 minutes
.trickle down
=>onElement
=>bubble up
La description:
quirksmode.org en a une belle description. En un mot (copié à partir de quirksmode):
Que faut-il utiliser?
Cela dépend de ce que vous voulez faire. Il n'y a rien de mieux. La différence est l'ordre d'exécution des gestionnaires d'événements. La plupart du temps, il sera bon de déclencher des gestionnaires d'événements dans la phase de propagation , mais il peut également être nécessaire de les déclencher plus tôt.
la source
S'il y a deux éléments, l'élément 1 et l'élément 2. L'élément 2 est à l'intérieur de l'élément 1 et nous attachons un gestionnaire d'événements avec les deux éléments, disons onClick. Maintenant, lorsque nous cliquons sur l'élément 2, eventHandler pour les deux éléments sera exécuté. Maintenant, la question est de savoir dans quel ordre l'événement s'exécutera. Si l'événement attaché à l'élément 1 s'exécute en premier, il est appelé capture d'événement et si l'événement attaché à l'élément 2 s'exécute en premier, cela s'appelle la propagation d'événement. Selon le W3C, l'événement commencera dans la phase de capture jusqu'à ce qu'il atteigne la cible revient à l'élément, puis il commence à bouillonner
Les états de capture et de propagation sont connus par le paramètre useCapture de la méthode addEventListener
Par défaut, useCapture est faux. Cela signifie qu'il est en phase bouillonnante.
Veuillez essayer de changer vrai et faux.
la source
the event will start in the capturing phase untill it reaches the target comes back to the element and then it starts bubbling
. J'ai seulement trouvé que addEventListener a le paramètreuseCapture
qui peut être défini sur true ou false; et en HTML 4.0, les écouteurs d'événement étaient spécifiés comme attributs d'un élément etuseCapture defaults to false
. Pourriez-vous créer un lien vers une spécification qui confirme ce que vous avez écrit?J'ai trouvé ce tutoriel sur javascript.info très clair pour expliquer ce sujet. Et son résumé en 3 points à la fin parle vraiment des points cruciaux. Je le cite ici:
la source
Il y a aussi le
Event.eventPhase
propriété qui peut vous dire si l'événement est sur la cible ou vient d'ailleurs.Notez que la compatibilité du navigateur n'est pas encore déterminée. Je l'ai testé sur Chrome (66.0.3359.181) et Firefox (59.0.3) et il y est pris en charge.
Développer sur l' extrait déjà grand de la réponse acceptée , c'est la sortie en utilisant la
eventPhase
propriétéla source
Bouillonnant
Capture
la source