He leído el artículo en https://developer.mozilla.org/en/DOM/element.addEventListener pero no puedo entender el useCapture
atributo. Definición hay:
Si es verdadero, useCapture indica que el usuario desea iniciar la captura. Después de iniciar la captura, todos los eventos del tipo especificado serán enviados al oyente registrado antes de ser enviados a cualquier EventTargets debajo de él en el árbol DOM. Los eventos que están burbujeando hacia arriba a través del árbol no activarán un oyente designado para usar captura.
En este código, el evento padre se dispara antes que el niño, por lo que no puedo entender su comportamiento.
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>
fuente
no specification is made as to the order in which they will receive the event with regards to the other EventListeners on the EventTarget
. No he probado todos los navegadores, por lo que es posible que todos lo implementen de la misma manera. Sin embargo, los eventos de captura se realizarán antes de los eventos sin captura.Creo que este diagrama es muy útil para comprender las fases de captura / objetivo / burbuja: http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
A continuación, contenido extraído del enlace.
Etapas
El evento se distribuye siguiendo una ruta desde la raíz del árbol a este nodo de destino. Luego se puede manejar localmente a nivel de nodo objetivo o desde los antepasados de cualquier objetivo más alto en el árbol. El despacho de eventos (también llamado propagación de eventos) ocurre en tres fases y en el siguiente orden:
Los antepasados del objetivo se determinan antes del envío inicial del evento. Si el nodo objetivo se elimina durante el envío, o si se agrega o elimina el ancestro de un objetivo, la propagación del evento siempre se basará en el nodo objetivo y los ancestros del objetivo determinados antes del envío.
Algunos eventos pueden no cumplir necesariamente las tres fases del flujo de eventos DOM, por ejemplo, el evento solo puede definirse para una o dos fases. Como ejemplo, los eventos definidos en esta especificación siempre lograrán las fases de captura y destino, pero algunos no lograrán la fase de burbujeo ("eventos de burbujeo" versus "eventos de no burbujeo", vea también el atributo Event.bubbles).
fuente
Window
, en lugar dedocument
, porquedocument
es hija deWindow
?Evento de captura (
useCapture = true
) vs Evento de burbuja (useCapture = false
)Referencia de MDN
useCapture
parámetro no importa (Gracias @bam y @ legend80s)stopPropagation()
detendrá el flujoManifestación
Resultado:
Target Bubble 1
(Debido a que Capture y Bubble of Target se activarán en el orden en que se registraron, el evento Bubble se activa antes del evento Capture)
Captura objetivo
fuente
Events in the target phase will trigger all listeners on an element in the order they were registered, regardless of the useCapture parameter.
De developer.mozilla.org/en-US/docs/Web/API/EventTarget/… . Por lo tanto, no existe una fase de "Captura de niños" y "Burbuja de niños".Cuando dice useCapture = true, los eventos se ejecutan de arriba a abajo en la fase de captura cuando es falso, hace una burbuja de abajo hacia arriba.
fuente
Se trata de modelos de eventos: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow Puede capturar eventos en la fase de burbujeo o en la fase de captura. Tu elección.
Eche un vistazo a http://www.quirksmode.org/js/events_order.html , lo encontrará muy útil.
fuente
Ejemplo de código:
Código Javascript:
si ambos se establecen en falso
Ejecuta: Al hacer clic en Div interno, las alertas se muestran como: Div 2> Div 1
Aquí el script se ejecuta desde el elemento interno: Event Bubbling (useCapture se ha establecido en falso)
div 1 se establece en verdadero y div 2 se establece en falso
Ejecuta: Al hacer clic en Div interno, las alertas se muestran como: Div 1> Div 2
Aquí el script se ejecuta desde el elemento ancestro / externo: Captura de eventos (useCapture se ha establecido en verdadero)
div 1 se establece en falso y div 2 se establece en verdadero
Ejecuta: Al hacer clic en Div interno, las alertas se muestran como: Div 2> Div 1
Aquí el script se ejecuta desde el elemento interno: Event Bubbling (useCapture se ha establecido en falso)
div 1 se establece en verdadero y div 2 se establece en verdadero
Ejecuta: Al hacer clic en Div interno, las alertas se muestran como: Div 1> Div 2
Aquí el script se ejecuta desde el elemento ancestro / externo: Captura de eventos ya que useCapture se ha establecido en verdadero
fuente
Resumen:
La
DOM
especificación descrita en:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
funciona de la siguiente manera:
Se distribuye un evento siguiendo una ruta desde la raíz (
document
) del árbol hasta el nodo de destino . El nodo de destino es elHTML
elemento más profundo , es decir, el event.target. El despacho de eventos (también llamado propagación de eventos) ocurre en tres fases y en el siguiente orden:document
) al padre directo del nodo de destino.html
elemento más profundo en el que se disparó el evento.Ejemplo:
El ejemplo anterior realmente ilustra la diferencia entre el burbujeo de eventos y la captura de eventos. Al agregar los oyentes de eventos con
addEventListener
, hay un tercer elemento llamado useCapture. Esto seboolean
establece cuandotrue
permite que el oyente de eventos use la captura de eventos en lugar del burbujeo de eventos.En nuestro ejemplo, cuando configuramos el argumento useCapture
false
, vemos que tiene lugar un burbujeo de eventos. Primero se dispara el evento en la fase de destino (registra innerBubble), y luego a través del evento que burbujea se dispara el evento en el elemento primario (registra outsideBubble).Cuando establecemos el argumento useCapture
true
, vemos que el evento en el exterior<div>
se dispara primero. Esto se debe a que el evento ahora se dispara en la fase de captura y no en la fase de burbujeo.fuente
Dadas las tres fases del viaje del evento :
useCapture
indica para qué fases estará el viaje del evento :La fuente es la misma que la segunda mejor respuesta: https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
fuente
El orden de definición solo importa si los artículos están al mismo nivel. Si invierte el orden de definición en su código obtendrá los mismos resultados.
Sin embargo, si invierte la configuración useCapture en los dos controladores de eventos, el controlador de eventos secundario responde antes que el padre. La razón de esto es que el controlador de eventos hijo ahora se activará en la fase de captura que es anterior a la fase de burbujeo en la que se activará el controlador de eventos padre.
Si establece useCapture en true para ambos manejadores de eventos, independientemente del orden de definición, el manejador de eventos padre se activará primero porque está antes que el hijo en la fase de captura.
Por el contrario, si configura useCapture en falso para ambos manejadores de eventos, nuevamente independientemente del orden de definición, el manejador de eventos hijo se activará primero porque viene antes que el padre en la fase de propagación.
fuente