Eventos en interfaces reales: del click básico a la delegación inteligente
Aprende a diseñar interacciones mantenibles con `addEventListener`, objeto `event`, `preventDefault`, gestión de propagación y delegación para listas dinámicas.
Una interfaz responde a eventos, no a deseos: click, input, submit, foco y teclado son señales que activan lógica de negocio y cambios visuales.
El salto de nivel medio está en dejar de escribir listeners aislados y empezar a diseñar un flujo de interacción robusto: qué se escucha, dónde se escucha y por qué.
Vas a aprender patrones que evitan bugs típicos como listeners duplicados, acciones por defecto no controladas y lógica rota en elementos renderizados dinámicamente.
Esta lección encaja con [javascript-dom-medio](/curso/javascript/leccion/javascript-dom-medio) y prepara terreno para [javascript-formularios-pro](/curso/javascript/leccion/javascript-formularios-pro).
- Antes de programar, define la interacción como una regla clara.
- Piensa cada interacción con esta frase: cuando ocurra X en Y, ejecuta Z y actualiza W. Esa estructura evita callbacks confusos y facilita depuración.
- No todos los eventos son iguales: algunos sirven para entrada continua (`input`), otros para intención final (`change`, `submit`) y otros para atajos de UX (`keydown`).
- Escucha donde tenga sentido, no donde caiga primero.
- `addEventListener` permite desacoplar HTML y comportamiento. Además, puedes tener varios listeners por nodo sin pisarlos entre sí.
Modelo mental: evento, objetivo, manejador y efecto
Antes de programar, define la interacción como una regla clara.
Piensa cada interacción con esta frase: cuando ocurra X en Y, ejecuta Z y actualiza W. Esa estructura evita callbacks confusos y facilita depuración.
No todos los eventos son iguales: algunos sirven para entrada continua (`input`), otros para intención final (`change`, `submit`) y otros para atajos de UX (`keydown`).
addEventListener con criterio de arquitectura
Escucha donde tenga sentido, no donde caiga primero.
`addEventListener` permite desacoplar HTML y comportamiento. Además, puedes tener varios listeners por nodo sin pisarlos entre sí.
Una buena práctica en componentes pequeños: centralizar referencias de nodos en un objeto `ui` y registrar listeners en una función `bindEvents()`.
- Nombra callbacks según intención (`onSaveClick`).
- Evita listeners inline en HTML.
- Agrupa binding para desmontar o testear mejor.
Objeto event en detalle: target vs currentTarget
Entender esta diferencia evita muchos bugs en listas y botones anidados.
`event.target` es el nodo que originó el evento; `event.currentTarget` es el nodo donde está registrado el listener. En delegación, esta distinción es obligatoria.
Cuando un botón contiene un icono y haces click en el icono, `target` puede ser el `<svg>` y no el botón. Por eso conviene usar `closest`.
preventDefault y propagación: control fino del flujo
Controla qué acción nativa se ejecuta y cómo viaja el evento.
`preventDefault()` bloquea la acción por defecto (ej. enviar formulario o navegar en enlace). Úsalo cuando quieras validar, confirmar o procesar datos antes.
En escenarios concretos, también puede ayudarte `stopPropagation()`, pero úsalo con criterio para no ocultar eventos útiles de niveles superiores.
Delegación de eventos para elementos dinámicos
Un listener en el contenedor escala mejor que cientos de listeners individuales.
Cuando renderizas tarjetas o filas desde datos, agregar listeners uno a uno complica mantenimiento. Con delegación, escuchas en el padre y detectas el elemento accionable con `closest`.
Este patrón sigue funcionando aunque luego añadas nuevos nodos al contenedor, sin necesidad de re-registrar listeners.