¿Cómo implementar un oyente de eventos eficiente para un modal?
En el desarrollo de aplicaciones web, el manejo eficiente de los eventos es clave para mejorar el rendimiento de la aplicación. Tradicionalmente, podríamos agregar un event listener a cada elemento que queramos que reaccione a un evento. Sin embargo, existe una técnica más óptima conocida como la propagación de eventos. Esta consiste en permitir que un solo elemento padre escuche los eventos de todos sus hijos, mejorando así el rendimiento.
¿Qué es la propagación de eventos?
La propagación de eventos es una técnica que permite que un evento generado en un elemento hijo se propague hacia arriba, hasta ser capturado por un elemento ancestro común. Esto es particularmente útil en marcos como React y Angular, donde el body del documento gestiona todos los eventos de sus elementos hijos. Esta técnica optimiza el manejo de eventos al reducir el número de listeners necesarios.
¿Cómo implementar la propagación de eventos?
Para implementarla en nuestra aplicación, en lugar de agregar un event listener a cada elemento a individualmente, podemos añadir un solo listener al body. Este manejará todos los clics en los hijos:
document.body.addEventListener('click',function(event){let tagName = event.target.tagName;if(tagName !=='IMG'&& tagName !=='A'){return;}// Código adicional para manejar el clic si es un elemento <img> o <a>});
¿Cómo filtrar eventos específicos?
Una vez integrado en el body, es crucial filtrar los eventos que realmente nos interesan. Utilizaremos las propiedades target y currentTarget de los eventos:
target: Elemento donde se originó el evento.
currentTarget: Elemento donde se capturó el evento.
Si solo nos interesa el origen, debemos utilizar target. Filtraremos solo para los elementos deseados, como imágenes o enlaces:
La extracción de información adicional, como un video ID de un enlace de YouTube, se puede hacer mediante el uso de dataset. Los atributos data-* se utilizan para almacenar datos personalizados en los elementos HTML:
¿Cómo refinar el código para un manejo más seguro?
Añadimos verificaciones para asegurar que solo interactuamos con elementos que posean la clase específica que necesitamos:
let link = event.target;if(link && link.classList.contains('js-video-link')){// Manipulación del enlace}
Al emplear estas técnicas, nuestro código se vuelve más eficiente y flexible, ajustándose mejor para futuras modificaciones. Con esta estructura optimizada, estamos listos para integrar librerías externas que requieran un manejo específico de los eventos.
Event Propagation y Filtrado de Eventos en JavaScript
me pareció la idea al profesor de lo que quiere hacer con el event delegation que toda una vida es mejor , pero porque hacer el event listener tan general ? , mi opinión es que se podria haber aplicado al cuadro donde esta los cards , al menos para el proposito de este proyecto , pero depronto omito algun detalle importante , entonces si saben pueden dejarlo en los comentarios 😀
Una observacion, se que este modulo es intermedio a avanzado, pero noto que los videos son largos y el numero de videos tambien mayor a la media que creia en unos de 2x , esto hace cansado de avanzar y desalienta un poco, en lo personal me gustan mas lo cursos que tienen videos no tan largos y que no sean tantos videos por el curso. Solo es una observacion, el curso esta bueno pero como que el formato esta desalentador de tomar
Encaja perfectamente como un filtro secundario de alta precisión. Cuando delegas eventos globales, verificar únicamente el tagName a menudo no es suficiente. Tu página podría tener cientos de enlaces (<a>), pero tú solo quieres activar un reproductor de video para ciertos enlaces específicos. Aquí es donde classList.contains('js-video-link') brilla. Al prefijar la clase con js-, creas una separación clara entre los estilos visuales (CSS) y el comportamiento interactivo (JavaScript). Si el elemento clickeado es un enlace Y además contiene esa clase específica, entonces procedes con la lógica de tu aplicación. Es un método a prueba de balas para garantizar que tu evento delegado solo se dispare exactamente en los componentes interactivos que has designado, ignorando el resto de la navegación.
La mejor estrategia es implementar un patrón de "retorno temprano" (early return) actuando como un filtro de seguridad. Una vez que capturas un clic a nivel del contenedor padre, puedes usar propiedades como event.target.tagName para verificar si el elemento clickeado es una imagen (IMG) o un enlace (A). Si no lo es, simplemente ejecutas un return para detener la función inmediatamente. Para mantener el código limpio, puedes agrupar las etiquetas permitidas en un arreglo y usar ['IMG', 'A'].includes(tagName). Esto evita que tu JavaScript ejecute lógica pesada, como abrir un modal o hacer peticiones de red, cuando el usuario hace clic accidentalmente en un párrafo aleatorio, un espacio en blanco o el fondo de la página.