Saltar al contenido

Burbujeo y Captura de Eventos en JavaScript

Dominando el Burbujeo y la Captura de Eventos en JavaScript

El burbujeo y la captura son dos fases en el modelo de propagación de eventos que ocurren cuando se activan eventos en el Modelo de Objetos del Documento (DOM). Comprender estos conceptos es crucial para manejar eventos de manera efectiva en aplicaciones web complejas. Esta guía explicará estos conceptos y proporcionará ejemplos prácticos para demostrar cómo funcionan.


Comprender el Burbujeo y la Captura de Eventos

Propagación de Eventos

La propagación de eventos en el DOM ocurre en tres fases:

  1. Fase de Captura: El evento comienza desde la parte superior del árbol DOM (objeto document) y se propaga hacia abajo hasta el elemento objetivo.
  2. Fase de Destino: El evento llega al elemento objetivo.
  3. Fase de Burbujeo: Después de alcanzar el objetivo, el evento burbujea desde el elemento objetivo de vuelta al documento.

Por defecto, la mayoría de los eventos en JavaScript se propagan en la fase de burbujeo a menos que se especifique lo contrario.

Burbujeo de Eventos

En la fase de burbujeo, un evento comienza en el elemento más específico (el punto más profundo posible en la estructura del documento) y luego fluye hacia arriba hacia el nodo menos específico (objeto document). Este es el comportamiento predeterminado para la mayoría de los eventos.

Ejemplo de burbujeo de eventos:


html
<div onclick="alert('You clicked the DIV!');">
  Click me or one of my children:
  <p onclick="alert('You clicked the P!');">Click me!</p>
</div>

Si haces clic en el elemento <p>, primero verás la alerta del elemento <p> y luego una alerta del elemento <div> a medida que el evento burbujea hacia arriba.

Captura de Eventos

La captura es la primera fase del modelo de propagación de eventos, donde el evento desciende hasta el elemento objetivo. No se usa comúnmente, pero puede ser útil para manejar eventos antes de que lleguen a su destino.

Para escuchar eventos en la fase de captura, estableces el tercer argumento de addEventListener en true:


javascript
<div id="outer" onclick="alert('Clicked the DIV!');">
  Click me or one of my children:
  <p id="inner" onclick="alert('Clicked the P!');">Click me!</p>
</div>

<script>
  document.getElementById('outer').addEventListener('click', function() {
    alert('Captured the click on DIV!');
  }, true); // Set to true to handle in the capturing phase

  document.getElementById('inner').addEventListener('click', function() {
    alert('Captured the click on P!');
  }, true);
</script>

Si haces clic en el elemento <p>, verás primero las alertas de captura en <div> y <p>, antes de las alertas de burbujeo habituales.

Ejemplos Prácticos de Burbujeo y Captura de Eventos

Ejemplo 1: Prevenir el Burbujeo de Eventos

A veces, querrás evitar que un evento burbujee hacia arriba en el árbol DOM:


html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Event Propagation Example</title>
<style>
  .container {
    width: 200px;
    height: 200px;
    background-color: lightblue;
    padding: 20px;
  }

  .box {
    width: 100px;
    height: 100px;
    background-color: pink;
    margin-top: 20px;
    cursor: pointer;
  }
</style>
</head>
<body>

<div class="container" onclick="alert('You clicked the container!');">
  Click the pink box to see event propagation:
  <div class="box" onclick="event.stopPropagation(); alert('You clicked the box without bubbling!');"></div>
</div>

</body>
</html>

En este ejemplo, hay un contenedor con un fondo azul claro que contiene una caja rosa. Hacer clic en cualquier lugar dentro del contenedor activa una alerta que dice "¡Hiciste clic en el contenedor!". Sin embargo, hacer clic en la caja rosa activa una alerta diferente que dice "¡Hiciste clic en la caja sin burbujear!" porque event.stopPropagation() evita que el evento de clic burbujee hasta el contenedor.

Ejemplo 2: Usar Burbujeo y Captura

Este ejemplo muestra cómo manejar un evento en ambas fases, captura y burbujeo:


html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Event Capture and Bubbling Example</title>
<style>
  body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
  }

  #outerContainer {
    border: 2px solid #ccc;
    padding: 20px;
    margin-bottom: 20px;
    background-color: #f9f9f9;
    border-radius: 10px;
  }

  #innerElement {
    background-color: #ffa8a8;
    padding: 10px;
    border-radius: 5px;
    cursor: pointer;
  }
</style>
</head>
<body>

<div id="outerContainer" onclick="alert('Event Bubbled from Outer Container');">
  <p style="margin: 0;">Click anywhere in this outer container:</p>
  <p id="innerElement">Click me!</p>
</div>

<script>
  // Event listener attached to the outer container during the capturing phase
  document.getElementById('outerContainer').addEventListener('click', function() {
    alert('Event Captured by Outer Container');
  }, true);

  // Event listener attached to the inner element during the bubbling phase
  document.getElementById('innerElement').addEventListener('click', function() {
    alert('Event Bubbled from Inner Element');
  }, false);
</script>

</body>
</html>
  • Contenedor Exterior (#outerContainer): Piensa en esto como la caja más grande. Tiene algo de texto dentro que dice "Haz clic en cualquier lugar de este contenedor exterior:". Dentro de esta caja, hay otra caja más pequeña.

    • Elemento Interior (#innerElement): Esta es la caja más pequeña dentro de la más grande. Tiene un texto que dice "¡Haz clic en mí!". Esta caja está dentro del contenedor exterior.
  • Manejadores de Eventos (Event Listeners):

    • Captura de Eventos: Cuando haces clic en cualquier lugar del contenedor exterior, primero se activa una alerta que dice "Evento capturado por el contenedor exterior". Es como si alguien atrapara el evento al entrar en el contenedor exterior.
    • Burbujeo de Eventos: Si haces clic en la caja interior ("¡Haz clic en mí!"), el evento burbujea hacia arriba. Es como una burbuja que sube desde la caja interior hasta el contenedor exterior. Cuando llega al contenedor exterior, activa otra alerta que dice "Evento burbujeado desde el elemento interior".

Por lo tanto, el contenedor exterior captura el evento cuando haces clic en cualquier lugar de él, y si haces clic en la caja interior, el evento burbujea hasta el contenedor exterior. ¡Así es como funcionan la captura y el burbujeo de eventos en HTML!

Conclusión

Comprender el burbujeo y la captura de eventos te permite controlar la propagación de eventos en tus aplicaciones web de manera efectiva. Al gestionar cómo se manejan los eventos a través de estas fases, puedes mejorar la interactividad de tu aplicación, prevenir la propagación no deseada de eventos y asegurar que los eventos se gestionen según tus necesidades específicas.

Práctica

¿Cuáles son las dos fases de propagación de eventos mencionadas en la URL proporcionada?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.