Diferencia entre Event Bubbling y Event Capturing

Javascript

En este breve tutorial vamos a ver en qué consisten las metodologías event bubbing y event capturing en lo que concierne a la interacción de JavaScript con el DOM.

Tanto Bubbling «Burbuja» como Capturing «Captura» son dos modelos que los eventos del DOM utilizan para propagarse.

Cuando interactúas con un elemento del DOM, como por ejemplo cuando haces clic en un botón, JavaScript ejecutará las acciones asociadas el evento que ha ocurrido. Sin embargo, también ejecutará los las acciones asociadas a los elementos del DOM que contengan al botón. Es decir, el clic se propagará desde los elementos de menor jerarquía hasta sus ancestros, a no ser que frenes la propagación de algún modo, como por ejemplo usando la función Event.preventDefault().

Para explicarlo mejor vamos a proponer el siguiente ejemplo:

<div id="container">
  <button id="boton" >Ey colega!</button>
</div>

Imagínate que quieres detectar cuando se hace clic en el botón #boton y que tienes un listener que has asociado el mismo mediante JavaScript:

document.getElementById('mi-boton').addEventListener('click', function(){
  console.log('Se ha detectado un clic en el botón');
});

Imagínate que también tienes otro listener en el elemento #container:

document.getElementById('container').addEventListener('click', function(){
  console.log('Se ha detectado un clic en el container');
});

Estos listeners se ejecutarán en orden, y este orden se determina mediante los modelos bubbling o capturing. Vamos a ver en qué consisten:

  • Event Bubbling: Los eventos se propagarán en orden ascendente desde le elemento en el que se hace clic, que es el de menor jerarquía, hasta sus padres, que son los de mayor jerarquía. En el ejemplo propuesto, la acción asociada al elemento #boton se iniciará antes que la acción asociada al elemento #container. Este es el método que se usa por defecto.
  • Event Capturing: Los eventos se propagarán en orden inverso, comenzando por los elementos de mayor jerarquía y descendiendo por su árbol de hijos hasta los elementos de menor jerarquía. Es decir, que JavaScript recorrerá el DOM desde el objeto Window e irá descendiendo hasta el elemento en el que hemos hecho clic. Con esta filosofía, en nuestro ejemplo se iniciaría primero la acción asociada al elemento #container y luego la asociada al elemento #boton.

Como ahora ya sabes, la metodología que se usa por defecto es la del bubbling, pero puedes usar también la metodología capturing agregando un tercer argumento al método addEventListener de JavaScript, que debería tener el valor true:

document.getElementById('container').addEventListener(
  'click',
  function(){
    console.log('Se ha detectado un clic en el container');
  },
  true
);

En JavaScript, primero se ejecutarán todas las acciones que usen la metodología capturing, comenzando desde el objeto Window y descendiendo hasta el elemento con el que hemos interactuado, y luego las que usen bubbling, por lo que ahora debería iniciarse primero el evento 'click' que hemos asociado el elemento #container.

Una vez se haya llegado desde el elemento Window hasta el objetivo, se repetirá el proceso, aunque ahora ascendiendo mediante bubbling hasta el objeto Window, iniciando las acciones asociadas al evento definidas mediante bubbling durante el camino.

Y esto ha sido todo.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”