Eventos e Interactividad (addEventListener)
Aprende a escuchar y responder a acciones del usuario con addEventListener: clics, teclado, formularios, el objeto de evento y e.preventDefault().
¿Qué son los Eventos?
Los eventos son señales que emite el navegador cuando ocurre una acción: el usuario hace clic en un botón, escribe en un campo de texto, envía un formulario o presiona una tecla.
El método estándar de la industria para escuchar eventos es addEventListener(), el cual permite asociar múltiples manejadores a un mismo elemento sin sobrescribir código previo:
elemento.addEventListener("tipoDeEvento", function(event) {
// Código que se ejecuta cuando ocurre el evento
});
Eventos Más Utilizados en la Web
| Evento | Cuándo se Dispara | Uso Habitual |
|---|---|---|
click |
Al hacer clic con el ratón o pulsar en pantalla táctil. | Botones, enlaces dinámicos, menús desplegables. |
input |
Cada vez que el valor de un <input> o <textarea> cambia. |
Validación en vivo, contadores de caracteres, búsquedas. |
submit |
Al intentar enviar un elemento <form>. |
Validación de formularios antes de enviar por AJAX/fetch. |
keydown / keyup |
Al presionar o soltar una tecla del teclado. | Atajos de teclado, navegación con flechas, tecla Enter. |
DOMContentLoaded |
Cuando el árbol HTML ha sido cargado por completo. | Inicializar scripts de manera segura. |
El Objeto de Evento (event) y preventDefault()
El manejador recibe automáticamente un objeto con información detallada de lo sucedido:
event.target: Referencia al elemento HTML exacto que disparó el evento.event.key: Nombre de la tecla pulsada (ej:"Enter","Escape").event.preventDefault(): Cancela el comportamiento por defecto del navegador (por ejemplo, evita que la página se recargue al enviar un formulario).
⚡ Formulario Reactivo con Validación en Vivo y Contador
Observa cómo addEventListener captura eventos de escritura (input) y previene la recarga del formulario (submit):
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Eventos con addEventListener</title>
<style>
body { font-family: Arial, Helvetica, sans-serif; padding: 25px; background: #f8fafc; }
.card-form { max-width: 480px; background: white; border: 1px solid #cbd5e1; border-radius: 8px; padding: 22px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 6px; font-weight: 600; color: #0f172a; font-size: 0.9rem; }
input[type="text"], textarea { width: 100%; box-sizing: border-box; padding: 9px 12px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 0.95rem; }
.contador { text-align: right; font-size: 0.8rem; color: #64748b; margin-top: 4px; }
.limite-cerca { color: #ea580c; font-weight: bold; }
button[type="submit"] { background: #0284c7; color: white; border: none; padding: 10px 18px; border-radius: 6px; font-weight: bold; cursor: pointer; width: 100%; }
button[type="submit"]:hover { background: #0369a1; }
.mensaje-exito { display: none; background: #dcfce7; color: #166534; border: 1px solid #86efac; padding: 12px; border-radius: 6px; margin-top: 15px; }
</style>
</head>
<body>
<div class="card-form">
<h3 style="margin-top: 0; color: #0f172a;">Publicar Comentario</h3>
<form id="formulario-comentario">
<div class="form-group">
<label for="nombre">Nombre Completo:</label>
<input type="text" id="nombre" name="nombre" placeholder="Ej: Santiago Andrés Gómez" required>
</div>
<div class="form-group">
<label for="mensaje">Mensaje (máximo 80 caracteres):</label>
<textarea id="mensaje" name="mensaje" rows="3" maxlength="80" placeholder="Escribe tu opinión aquí..."></textarea>
<div class="contador" id="indicador-caracteres">0 / 80 caracteres</div>
</div>
<button type="submit" id="btn-enviar">Publicar Comentario</button>
</form>
<div class="mensaje-exito" id="caja-exito"></div>
</div>
<script>
const formulario = document.getElementById('formulario-comentario');
const campoMensaje = document.getElementById('mensaje');
const indicador = document.getElementById('indicador-caracteres');
const cajaExito = document.getElementById('caja-exito');
// 1. Escuchar evento 'input' para conteo reactivo
campoMensaje.addEventListener('input', function(e) {
const longitud = e.target.value.length;
indicador.textContent = `${longitud} / 80 caracteres`;
if (longitud >= 70) {
indicador.classList.add('limite-cerca');
} else {
indicador.classList.remove('limite-cerca');
}
});
// 2. Escuchar evento 'submit' con preventDefault
formulario.addEventListener('submit', function(e) {
e.preventDefault(); // Evita recargar la página
const autor = document.getElementById('nombre').value;
const texto = campoMensaje.value;
cajaExito.style.display = 'block';
cajaExito.innerHTML = `<strong>¡Comentario publicado con éxito!</strong><br><em>"${texto}"</em> — por <strong>${autor}</strong>.`;
formulario.reset();
indicador.textContent = "0 / 80 caracteres";
indicador.classList.remove('limite-cerca');
});
</script>
</body>
</html>
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar Manual Completo de JavaScript ES6+ y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.