Tutorial: Como Usar La Delegacion De Eventos En Javascript
Tutorial: Como Usar La Delegacion De Eventos En Javascript te guía paso a paso.
Imagina una tabla con cientos de celdas dinámicas.
¿Agregarías un listener por celda? Eso sería un caos de memoria.
La delegación de eventos cambia todo.
Usa la propagación natural para manejar clics en un ancestro común.
Tu código se vuelve eficiente y escalable.
¿Qué es la propagación de eventos?
Los eventos en JavaScript no se quedan quietos.
Se propagan desde el elemento clicado hacia arriba en el DOM.
💡 Si estás explorando el mundo del análisis de datos, descubre en esta guía exhaustiva de distribuciones probabilísticas todos los tipos clave explicados paso a paso para potenciar tus modelos estadísticos.
Esto se llama event bubbling.
Por ejemplo, un clic en un botón activa también a su padre div.
¿Has visto eso pasar sin querer?
Mira este HTML simple:
<div id="padre">
<span>Contenido</span>
<button>¡Clic aquí!</button>
</div>
Si haces clic en el botón, el evento sube al span y al div.
El objeto event guarda el origen real con event.target.
document.getElementById('padre').addEventListener('click', (event) => {
console.log(event.target.tagName); // 'BUTTON'
});
💡 Si estás diseñando tablas en tu base de datos y dudas sobre qué tipo de dato SQL usar, este guía te aclara numéricos, cadenas y más para una optimización impecable.
¿Pregunta común? ¿Y si quiero parar la propagación?
Usa event.stopPropagation(). Pero en delegación, la queremos.
Cómo funciona la delegación de eventos
Delegación de eventos significa escuchar en un padre.
No en cada hijo. Ideal para listas grandes o elementos dinámicos.
El truco: verificar event.target en el handler del padre.
Si coincide con lo esperado, actúa.
💡 Si estás debatiendo cuál sistema operativo elegir para tu día a día, echa un vistazo a esta comparativa definitiva Windows vs. Mac vs. Linux para tomar la decisión perfecta según tus necesidades.
Ejemplo básico con botones:
<ul id="lista">
<li><button>Botón 1</button></li>
<li><button>Botón 2</button></li>
<li><button>Botón 3</button></li>
</ul>
Código tradicional: un listener por botón. Malo para muchos.
// Mala práctica
document.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', () => console.log('Clic!'));
});
Con delegación:
💡 Si estás profundizando en programación y quieres dominar la base de cualquier código limpio, descubre los tipos de datos esenciales para variables y evita confusiones desde el principio.
document.getElementById('lista').addEventListener('click', (event) => {
if (event.target.tagName === 'BUTTON') {
console.log(event.target.textContent);
}
});
¿Ves la diferencia? Un solo listener.
Ahorras memoria. Perfecto si agregas botones con JS después.
Beneficios clave de la delegación
¿Por qué molestarte con esto?
Primero, menor uso de memoria. No cientos de listeners.
Segundo, soporta contenido dinámico.
Elementos agregados después funcionan sin reasignar.
💡 Si estás debuggeando código y dudas entre usar variables mutables o constantes inmutables, descubre las diferencias clave entre var, let y const para escribir un código más limpio y predecible.
Tercer beneficio: código más limpio.
Una función maneja todo. Menos repetición.
Piensa en una app de tareas.
Lista infinita de items. Delegación la hace fluida.
Tabla comparativa:
| Aspecto | Listeners individuales | Delegación de eventos |
|---|---|---|
| Memoria | Alta | Baja |
| Elementos dinámicos | No funciona | Sí |
| Mantenibilidad | Baja | Alta |
| Performance | Peor en listas grandes | Mejor |
¿Te convence? Yo lo uso siempre en tablas o menús.
Humor rápido: sin delegación, tu navegador suda como en verano.
Con ella, respira aliviado.
Ejemplo práctico: tabla interactiva
Inspirado en tablas Bagua.
Haz clic en celdas para resaltarlas. Muchas celdas, un listener.
HTML:
<table id="tabla">
<tr>
<td>NorOeste</td>
<td>Norte</td>
<td>NorEste</td>
</tr>
<!-- Más filas... -->
</table>
CSS para highlight:
.highlight {
background: yellow;
}
JavaScript con delegación:
let celdaSeleccionada = null;
document.getElementById('tabla').addEventListener('click', (event) => {
let td = event.target.closest('td');
if (!td || !document.getElementById('tabla').contains(td)) return;
if (celdaSeleccionada) {
celdaSeleccionada.classList.remove('highlight');
}
celdaSeleccionada = td;
celdaSeleccionada.classList.add('highlight');
});
closest('td') busca el ancestro td más cercano.
Genial si clicas en strong dentro de td.
¿Y si hay tablas anidadas? La verificación contains lo soluciona.
Funciona con 9 o 900 celdas. Añade o quita dinámicamente.
Prueba en consola. Agrega una fila con tabla.insertRow().
¡Sigue funcionando! Magia pura.
Casos avanzados y trampas comunes
¿Quieres filtrar por clase? Fácil.
lista.addEventListener('click', (event) => {
if (event.target.matches('.borrar')) {
event.target.closest('li').remove();
}
});
matches() chequea clases o selectores.
Más preciso que solo tagName.
Trampa: eventos en inputs dentro de items.
Delegación los captura igual. Usa event.target.tagName === 'INPUT'.
Otra: fase de captura. Por defecto bubbling, pero puedes capturar bajando.
elemento.addEventListener('click', handler, { capture: true });
Raro usarlo en delegación. Stick a bubbling.
Pregunta típica: ¿y touch events en móvil?
Igual. touchstart delega perfecto.
Performance: en body como padre, cuidado con scrolls.
Mejor un contenedor cercano.
Ejemplo dinámico: lista de tareas.
<ul id="tareas"></ul>
<button id="agregar">Añadir tarea</button>
document.getElementById('agregar').addEventListener('click', () => {
const li = document.createElement('li');
li.innerHTML = '<span>Tarea nueva</span><button class="borrar">X</button>';
document.getElementById('tareas').appendChild(li);
});
document.getElementById('tareas').addEventListener('click', (event) => {
if (event.target.matches('.borrar')) {
event.target.closest('li').remove();
}
});
¡Botones dinámicos funcionan al instante!
Sin reasignar nada.
Mejores prácticas y cuándo usarla
Usa delegación de eventos en:
-
Listas largas (menús, tablas).
-
Contenido cargado via AJAX.
-
Apps SPAs con renders frecuentes.
Evítala en eventos raros o elementos fijos.
Para un solo botón, directo es fine.
Siempre verifica event.target estrictamente.
Evita bugs.
Quote útil de MDN: “Event delegation allows handling events on many elements with one handler.”
Debug tip: console.log(event.target) siempre.
Ve qué captura.
¿Dudas sobre Shadow DOM? Delegación vanilla no cruza boundaries.
Usa custom events ahí.
En frameworks como React, eventos sintéticos simulan delegación.
Pero en vanilla JS, es nativo y poderoso.
Integración con librerías modernas
En Vue o Angular, delegación es built-in.
Pero entiende el bajo nivel.
Para Vanilla pros: combina con MutationObserver para cambios DOM.
Aunque delegación sola basta.
Benchmark rápido: 1000 botones.
-
Individual: ~1000 listeners, lag en mobile.
-
Delegación: 1 listener, suave.
Datos reales muestran 10x menos memoria.
¿Listo para probar? Crea tu lista infinita.
Verás la diferencia.
Este Tutorial: Como Usar La Delegacion De Eventos En Javascript te arma para código pro.
Practica en CodePen. Comparte tus ejemplos.
Sigue explorando JS events. Hay más trucos.
¡Nos vemos en el próximo post!