event-bubbling-y-event-capturing-en-javascript

Event capturing y bubbling en JavaScript

El modelo de eventos en JavaScript se basa en un sistema de propagación que permite a los eventos pasar de padres a hijos y viceversa a través de la estructura del documento.

Es importante entender el modelo para controlar el orden en el que responden a un evento los elementos del DOM.

Por ejemplo, cuando hacemos click en un botón de un formulario, estamos haciendo click tanto en el formulario, como en el botón.

event-phases

¿Cuál responderá primero?

¿Qué elemento quieres que reaccione porimero click? ¿Y cómo se lo indicamos a JavaScript? Aquí es donde entra el modelo de propagación de eventos.

Este modelo tiene tres fases:

FaseOrden de Ejecución
Captura (Capturing)Desde document al objetivo
Objetivo (Target)En el objetivo mismo
Burbuja (Bubbling)Del objetivo a document

El target es el elemento más bajo en el DOM que recibe el evento.

Es decir, los eventos ocurren en el documento, y van pasando hasta el botón. A continuación, vuelven a hacer el camino en dirección contraria, de vuelta al documento.

Vamos a ver cada una de ellas 👇

Event capturing

Es la primera fase, en la que el evento se propaga desde el documento raíz hacia el elemento objetivo.

event-capturing

En nuestro ejemplo,

  • El evento se movería desde el documento raiz, hacia el botón
  • Activaría por en medio los manejadores de eventos de todos los elementos intermedios.

Es menos frecuentemente utilizada para capturar eventos que el bubbling.

Event bubbling

En ella el evento se propaga desde el elemento objetivo hacia el documento.

Esta fase ocurre después de la fase del capturing, y permite que los elementos padre manejen los eventos generados en sus elementos hijos.

event-bubbling

Es decir, en el ejemplo,

  • El evento se movería desde el botón hacía el documento
  • Igualmente, activaría por en medio los manejadores de eventos de todos los elementos intermedios.

Esta es la fase por defecto en la mayoría de los navegadores y es la que se utiliza comúnmente en la gestión de eventos.

No todos los eventos soportan bubbling, pero la mayoría lo hace (por ejemplo, click sí, pero focus no).

Captura en una u otra fase

Los eventos del DOM pasan siempre por esas fases. Y nosotros podemos elegir en que fase queremos responder al evento.

Para ello disponemos de un parámetro en addEventHandler.

  • true: Captura.
  • false (o no especificado): Burbuja.

Detener la propagación de eventos

En ocasiones, es necesario evitar que un evento se propague a través del DOM, ya sea durante la fase de captura o de burbuja.

Para ello, JavaScript proporciona dos métodos útiles:

MétodoDescripción
stopPropagation()Detiene la propagación del evento, impidiendo que siga viajando hacia los elementos padres.
| `stopImmediatePropagation()` | Además de detener la propagación, evita que otros manejadores del mismo evento se ejecuten en el mismo elemento. |