Saltar al contenido
Curso de JavaScript
Todos los cursos Ir al ejercicio →

Eventos y formularios

  • ⏱ 45 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Reaccionar a clics, teclas y formularios con addEventListener.
  • Leer los campos de un formulario y validarlos con mensajes accesibles.
  • Usar preventDefault y entender el burbujeo.
  • Aplicar la delegación de eventos en listas dinámicas.

1.Qué es un evento

Un evento es algo que ocurre en la página: un clic, una tecla pulsada, un formulario enviado, la ventana que cambia de tamaño, una imagen que termina de cargar. JavaScript te permite escuchar esos eventos y ejecutar una función cuando suceden. Así la página deja de ser un documento estático y se vuelve interactiva.

La fórmula básica
elemento.addEventListener("tipo-de-evento", funcion);
//            ① qué escuchar    ② qué hacer
▶ Tu primer evento
Consola

La función que pasas se llama manejador (*handler*) o callback. No se ejecuta al escribirla: el navegador la guarda y la llama cada vez que ocurre el evento.

⚠️ Importante · No pongas paréntesis

boton.addEventListener("click", saludar) pasa la función para que el navegador la llame cuando toque. boton.addEventListener("click", saludar()) la ejecuta ya y pasa su resultado. Es el error más común con eventos.

2.Los eventos más usados

EventoCuándo ocurreTípico en
clickSe pulsa (con ratón, dedo o teclado en un botón)Botones, enlaces, tarjetas
dblclickDoble clic
inputCada vez que cambia lo escritoBuscadores en vivo, contadores de caracteres
changeCuando el valor cambia y se confirma (al salir del campo)select, checkbox, radio
submitSe envía un <form>Formularios
keydown / keyupSe pulsa / suelta una teclaAtajos, juegos
mouseover / mouseoutEl cursor entra / saleEfectos
focus / blurEl elemento recibe / pierde el focoValidar al salir del campo
scroll, resizeSe desplaza / cambia el tamañoBarras, cabeceras
DOMContentLoadedEl HTML ya se leyóIniciar el programa
loadTodo cargó (imágenes incluidas)

3.El objeto del evento

El navegador llama a tu función pasándole un objeto con información sobre lo ocurrido. Por convención se llama evento o e:

▶ Qué sabe el evento
Consola
PropiedadQué da
e.targetEl elemento donde ocurrió el evento
e.currentTargetEl elemento al que está pegado el manejador
e.typeEl nombre del evento ("click")
e.keyLa tecla pulsada ("Enter", "a", "Escape")
e.clientX, e.clientYPosición del cursor
e.preventDefault()Cancela la acción por defecto
e.stopPropagation()Detiene que el evento «suba» a los padres

4.Formularios: submit y preventDefault

Un formulario HTML, al enviarse, recarga la página y manda los datos al servidor. Con JavaScript casi siempre queremos evitarlo y procesar los datos nosotros. Para eso, e.preventDefault():

▶ Un formulario con JavaScript
Consola

💡 Consejo · Escucha submit, no click

Escucha submit en el <form>, no click en el botón. Así también funciona al pulsar Enter dentro de un campo, y respetas la validación del navegador (required, type="email"…).

Leer los valores de los campos

CampoPropiedadTipo de dato
input type="text", textarea, select.valueSiempre texto (convierte con Number())
input type="number".value / .valueAsNumberTexto / número
input type="checkbox".checkedtrue / false
input type="radio" (grupo)querySelector("input[name=x]:checked")?.valueTexto o undefined
Todo el formularioObject.fromEntries(new FormData(form))Un objeto con todos los campos
▶ FormData
Consola

5.Validar y mostrar mensajes

HTML ya valida mucho (required, minlength, type="email", pattern). JavaScript te permite reglas propias y mensajes claros dentro de la página, en lugar de ventanas emergentes:

▶ Validación propia
Consola

6.Propagación y delegación de eventos

Cuando ocurre un evento en un elemento, «sube» por sus ancestros: primero se avisa al elemento, luego a su padre, a su abuelo… hasta document. A esto se le llama burbujeo (*bubbling*).

Y de ahí sale una técnica muy potente, la delegación de eventos: en lugar de poner un manejador a cada elemento de una lista, pones uno solo en el contenedor y miras e.target para saber cuál se pulsó. Funciona también con los elementos que añadas después.

▶ Delegación
Consola

📌 Nota · closest()

e.target.closest("li") sube desde el elemento pulsado hasta encontrar el li más cercano. Es más robusto que e.target a secas, porque el clic puede caer en un <strong> dentro del <li>.

7.Teclado y accesibilidad

▶ Atajos de teclado
Consola

8.Más opciones de addEventListener

OpciónEfectoEjemplo
{ once: true }El manejador se ejecuta una sola vezboton.addEventListener("click", f, { once: true })
removeEventListenerQuita un manejador (necesita la misma función)boton.removeEventListener("click", f)
{ passive: true }Promete no cancelar (mejora el rendimiento del scroll)addEventListener("scroll", f, { passive: true })
Un manejador nombrado se puede quitar
function saludar() { console.log("¡Hola!"); }

boton.addEventListener("click", saludar);
boton.removeEventListener("click", saludar);     // funciona porque es la misma función

// Con una flecha anónima NO se puede quitar:
boton.addEventListener("click", () => console.log("x"));

💡 Consejo · Debounce

Para eventos que se disparan muchísimas veces (input, scroll, resize), conviene esperar a que el usuario pare antes de hacer algo costoso. Esa técnica se llama *debounce* y se apoya en setTimeout, que verás en la siguiente lección.

9.Errores frecuentes

📒 Apuntes para llevar

  • elemento.addEventListener("evento", funcion) ejecuta tu función cuando ocurre el evento; pasa la función, no la llames.
  • Eventos habituales: click, input, change, submit, keydown, focus, DOMContentLoaded.
  • El objeto del evento (e) da target, key, type… y preventDefault() cancela la acción por defecto.
  • En un formulario escucha submit y llama a e.preventDefault(); lee los campos con .value, .checked o FormData.
  • Los valores de los campos son texto: conviértelos con Number().
  • Valida con mensajes dentro de la página, enlazados con aria-describedby y anunciados con role="alert".
  • Los eventos burbujean: la delegación pone un solo manejador en el contenedor y usa e.target.closest(…).
  • Usa button para acciones, soporta el teclado y evita onclick en el HTML.

10.Glosario

TérminoSignificado
EventoAlgo que ocurre en la página (clic, tecla, envío…).
Manejador (handler)Función que se ejecuta cuando ocurre un evento.
addEventListenerMétodo que registra un manejador para un evento.
Objeto del eventoInformación que recibe el manejador (e).
preventDefault()Cancela el comportamiento por defecto del navegador.
Burbujeo (bubbling)Propagación del evento desde el elemento hacia sus ancestros.
DelegaciónUn manejador en el padre que atiende a los hijos usando e.target.
FormDataObjeto que reúne los valores de un formulario.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Cuál es la forma correcta de asociar una función a un clic?

Un formulario recarga la página al enviarse. ¿Cómo evitarlo?

input.value de un input type="number" con «5» es…

¿Para qué sirve la delegación de eventos?

¿Por qué es mejor un <button> que un <div> con click?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio