J'ai lu l'article sur https://developer.mozilla.org/en/DOM/element.addEventListener mais je n'arrive pas à comprendre l' useCapture
attribut. Définition il y a:
Si la valeur est true, useCapture indique que l'utilisateur souhaite lancer la capture. Après avoir lancé la capture, tous les événements du type spécifié seront distribués à l'écouteur enregistré avant d'être distribués aux EventTargets situés en dessous dans l'arborescence DOM. Les événements qui remontent dans l'arborescence ne déclencheront pas d'auditeur désigné pour utiliser la capture.
Dans ce code, l'événement parent se déclenche avant l'enfant, donc je ne suis pas en mesure de comprendre son comportement.
function load() {
document.addEventListener("click", function() {
alert("parent event");
}, true);
document.getElementById("div1").addEventListener("click", function() {
alert("child event");
}, false);
}
<body onload="load()">
<div id="div1">click me</div>
</body>
la source
no specification is made as to the order in which they will receive the event with regards to the other EventListeners on the EventTarget
. Je n'ai pas testé tous les navigateurs, il se peut donc que tous les implémentent de la même manière. Les événements de capture seront cependant effectués avant les événements non capturés.Je trouve que ce diagramme est très utile pour comprendre les phases de capture / cible / bulle: http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
Ci-dessous, le contenu extrait du lien.
Phases
L'événement est distribué en suivant un chemin depuis la racine de l'arborescence vers ce nœud cible. Il peut ensuite être géré localement au niveau du nœud cible ou à partir des ancêtres de n'importe quelle cible plus haut dans l'arborescence. La répartition des événements (également appelée propagation d'événements) se déroule en trois phases et dans l'ordre suivant:
Les ancêtres de la cible sont déterminés avant l'envoi initial de l'événement. Si le nœud cible est supprimé lors de la répartition ou si l'ancêtre d'une cible est ajouté ou supprimé, la propagation de l'événement sera toujours basée sur le nœud cible et les ancêtres de la cible déterminés avant la répartition.
Certains événements peuvent ne pas nécessairement accomplir les trois phases du flux d'événements DOM, par exemple l'événement ne peut être défini que pour une ou deux phases. Par exemple, les événements définis dans cette spécification accompliront toujours les phases de capture et cible mais certains n'accompliront pas la phase de propagation ("événements de propagation" contre "événements sans propagation", voir également l'attribut Event.bubbles).
la source
Window
, au lieu dedocument
, parce quedocument
est un enfant deWindow
?Événement de capture (
useCapture = true
) vs Événement de bulle (useCapture = false
)Référence MDN
useCapture
paramètre n'a pas d'importance (merci @bam et @ legend80s)stopPropagation()
arrêtera le fluxDémo
Résultat:
Bulle cible 1
(Parce que Capture et Bubble of Target se déclencheront dans l'ordre dans lequel ils ont été enregistrés, donc l'événement Bubble est déclenché avant l'événement Capture)
Capture de cible
la source
Events in the target phase will trigger all listeners on an element in the order they were registered, regardless of the useCapture parameter.
Depuis developer.mozilla.org/en-US/docs/Web/API/EventTarget/… . Il n'y a donc pas de phase de "Capture d'Enfants" et de "Bulle d'Enfants".Lorsque vous dites useCapture = true, les événements s'exécutent de haut en bas dans la phase de capture lorsque false, cela fait une bulle de bas en haut.
la source
Il s'agit de modèles d'événements: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow Vous pouvez capturer un événement en phase de propagation ou en phase de capture. Votre choix.
Jetez un œil à http://www.quirksmode.org/js/events_order.html - vous le trouverez très utile.
la source
Exemple de code:
Code Javascript:
si les deux sont définis sur false
Exécute: Onclicking Inner Div, les alertes sont affichées comme: Div 2> Div 1
Ici, le script est exécuté à partir de l'élément interne: Event Bubbling (useCapture a été défini sur false)
div 1 est défini sur true et div 2 sur false
Exécute: Onclicking Inner Div, les alertes sont affichées comme: Div 1> Div 2
Ici, le script est exécuté à partir de l'élément ancêtre / externe: Capture d'événement (useCapture a été défini sur true)
div 1 est défini sur false et div 2 sur true
Exécute: Onclicking Inner Div, les alertes sont affichées comme: Div 2> Div 1
Ici, le script est exécuté à partir de l'élément interne: Event Bubbling (useCapture a été défini sur false)
div 1 est défini sur true et div 2 sur true
Exécute: Onclicking Inner Div, les alertes sont affichées comme: Div 1> Div 2
Ici, le script est exécuté à partir de l'élément ancêtre / externe: Capture d'événement depuis que useCapture a été défini sur true
la source
Résumé:
La
DOM
spécification décrite dans:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
fonctionne de la manière suivante:
Un événement est distribué suivant un chemin depuis la racine (
document
) de l'arborescence jusqu'au nœud cible . Le nœud cible est l'HTML
élément le plus profond , c'est-à-dire le event.target. La répartition des événements (également appelée propagation d'événements) se déroule en trois phases et dans l'ordre suivant:document
) au parent direct du nœud cible.html
élément le plus profond sur lequel l'événement a été diffusé.Exemple:
L'exemple ci-dessus illustre vraiment la différence entre la propagation d'événements et la capture d'événements. Lors de l'ajout des écouteurs d'événement avec
addEventListener
, il existe un troisième élément appelé useCapture. Ceci,boolean
qui, lorsqu'il est défini sur,true
permet à l'écouteur d'événements d'utiliser la capture d'événements au lieu de la propagation d'événements.Dans notre exemple, lorsque nous définissons l'argument useCapture sur,
false
nous voyons que la propagation d' événements a lieu. Tout d'abord, l'événement de la phase cible est déclenché (enregistre innerBubble), puis via un bullage d'événement, l'événement dans l'élément parent est déclenché (enregistre externalBubble).Lorsque nous définissons l'argument useCapture sur
true
nous voyons que l'événement à l'extérieur<div>
est déclenché en premier. En effet, l'événement est maintenant déclenché dans la phase de capture et non dans la phase de propagation.la source
Compte tenu des trois phases du voyage événementiel :
useCapture
indique pour quelles phases l'événement Voyage sera sur:La source est la même que la deuxième meilleure réponse: https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
la source
L'ordre de définition n'a d'importance que si les éléments sont au même niveau. Si vous inversez l'ordre de définition dans votre code, vous obtiendrez les mêmes résultats.
Toutefois, si vous inversez le paramètre useCapture sur les deux gestionnaires d'événements, le gestionnaire d'événements enfant répond avant celui du parent. La raison en est que le gestionnaire d'événements enfant sera désormais déclenché dans la phase de capture qui est antérieure à la phase de propagation dans laquelle le gestionnaire d'événements parent sera déclenché.
Si vous définissez useCapture sur true pour les deux gestionnaires d'événements - quel que soit l'ordre de définition - le gestionnaire d'événements parent sera déclenché en premier car il précède l'enfant dans la phase de capture.
Inversement, si vous définissez useCapture sur false pour les deux gestionnaires d'événements - à nouveau quel que soit l'ordre de définition - le gestionnaire d'événements enfant sera déclenché en premier car il précède le parent dans la phase de propagation.
la source