Terminología
De quirksmode.org :
Captura de eventos
Cuando usa la captura de eventos
El | El |
--------------- | | -----------------
El | elemento1 | El | El |
El | ----------- | | ----------- |
El | | element2 \ / | El |
El | ------------------------- |
El | Evento CAPTURING |
-----------------------------------
el controlador de eventos de element1 se dispara primero, el controlador de eventos de element2 se dispara por último.
Evento burbujeante
Cuando usa burbujeo de eventos
/ \
--------------- | | -----------------
El | elemento1 | El | El |
El | ----------- | | ----------- |
El | | element2 | El | El | El |
El | ------------------------- |
El | Evento BUBBLING |
-----------------------------------
el controlador de eventos de element2 se dispara primero, el controlador de eventos de element1 se dispara por último.
Cualquier evento que tenga lugar en el modelo de evento W3C se captura primero hasta que alcanza el elemento objetivo y luego vuelve a aparecer .
El | El | / \
----------------- | | - | | -----------------
El | elemento1 | El | El | El | El |
El | ------------- | | - | | ----------- |
El | | element2 \ / | El | El | El |
El | -------------------------------- |
El | Modelo de evento W3C |
------------------------------------------
Interfaz
Desde w3.org , para la captura de eventos :
Si la captura EventListener
desea evitar que se produzca un mayor procesamiento del evento, puede llamar al stopPropagation
método de la
Event
interfaz. Esto evitará un envío adicional del evento, aunque los EventListeners
registros adicionales en el mismo nivel de jerarquía seguirán recibiendo el evento. Una vez que stopPropagation
se ha llamado al método de un evento , las llamadas adicionales a ese método no tienen ningún efecto adicional. Si no existen capturadores adicionales y
stopPropagation
no se ha llamado, el evento activa el apropiado EventListeners
en el objetivo mismo.
Para eventos burbujeantes :
Cualquier controlador de eventos puede optar por evitar una mayor propagación de eventos llamando al stopPropagation
método de la Event
interfaz. Si alguno
EventListener
llama a este método, se activarán todos los adicionales EventListeners
en la corriente EventTarget
pero el burbujeo cesará en ese nivel. Solo se requiere una llamada a stopPropagation
para evitar más burbujeos.
Para cancelación de eventos :
La cancelación se logra llamando al
método Event
's preventDefault
. Si una o más EventListeners
llamadas preventDefault
durante cualquier fase del flujo de eventos, la acción predeterminada se cancelará.
Ejemplos
En los siguientes ejemplos, un clic en el hipervínculo en el navegador web activa el flujo del evento (se ejecutan los oyentes del evento) y la acción predeterminada del objetivo del evento (se abre una nueva pestaña).
HTML:
<div id="a">
<a id="b" href="http://www.google.com/" target="_blank">Google</a>
</div>
<p id="c"></p>
JavaScript:
var el = document.getElementById("c");
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
}
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
}
function bubblingOnClick1(ev) {
el.innerHTML += "DIV event bubbling<br>";
}
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
}
// The 3rd parameter useCapture makes the event listener capturing (false by default)
document.getElementById("a").addEventListener("click", capturingOnClick1, true);
document.getElementById("b").addEventListener("click", capturingOnClick2, true);
document.getElementById("a").addEventListener("click", bubblingOnClick1, false);
document.getElementById("b").addEventListener("click", bubblingOnClick2, false);
Ejemplo 1 : da como resultado la salida
DIV event capture
A event capture
A event bubbling
DIV event bubbling
Ejemplo 2 : agregar stopPropagation()
a la función
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
resultados en la salida
DIV event capture
El oyente del evento evitó una mayor propagación hacia abajo y hacia arriba del evento. Sin embargo, no impidió la acción predeterminada (una nueva pestaña de apertura).
Ejemplo 3 : agregar stopPropagation()
a la función
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
o la función
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
resultados en la salida
DIV event capture
A event capture
A event bubbling
Esto se debe a que ambos oyentes de eventos están registrados en el mismo objetivo de evento. Los oyentes del evento impidieron una mayor propagación ascendente del evento. Sin embargo, no impidieron la acción predeterminada (una nueva pestaña de apertura).
Ejemplo 4 : agregar preventDefault()
a cualquier función, por ejemplo
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
evita que se abra una nueva pestaña.
event.stop
funciones ... También es raro que nunca haya tenido problemas con eso. Yo uso mucho burbujear. Gracias por el ejemplo!