Detectores de eventos
En el guardarropa hay una percha. El botón es #peg y dice hang. Debajo, #ticket dice blank.
La página anterior era el timbre y la propiedad onclick. Allí había un solo hueco. La segunda función sustituía a la primera. Aquí no escribimos esa propiedad. typeof y this también eran de aquella página.
Esta página es addEventListener. Añade la función a la lista de clic del botón. Esa línea no la ejecuta. El ticket sigue en blank hasta que llamas a peg.click().
Añades wool y luego silk. La segunda no aparta a la primera. Un clic ejecuta las dos: primero wool, después silk. El ticket queda wool silk. El texto del botón sigue siendo hang.
Si pasas la misma función wool dos veces, la segunda vez no añade nada. Un clic, una ejecución.
removeEventListener quita la función que tú añadiste. Una función nueva, aunque copie las líneas de wool, es otro objeto. wool se queda.
El script de la página añade las dos y hace clic una vez. La línea bajo la percha es wool silk / 2 / peg. Aquí no se crea un elemento, no se escribe un estilo y no se lee el argumento del evento. Eso es la página siguiente.
Dos ganchos, no un hueco
getElementById solo te da el botón y el párrafo del ticket. Cada llamada a addEventListener puede poner otro oyente al lado. El clic recorre la lista de principio a fin. Estas funciones no reciben parámetro. El objeto evento es la página siguiente.
Quién escucha
El botón empieza con hang y debajo está blank. Lee las filas en orden. Cada fragmento parte de ese botón nuevo, salvo la fila de la página, que es la demo de abajo. Esa demo no quita a nadie.
📊 Quién escucha
| Momento | Quién escucha | Texto del ticket | Confusión fácil |
|---|---|---|---|
click y aún no hay oyente |
nadie | blank | un clic vacío escribe wool |
addEventListener de wool, antes del click |
wool | blank | la propia llamada escribe wool |
click solo con wool |
wool | wool | el texto del botón pasa a wool |
wool y luego silk, un click |
ambos, wool y luego silk | wool silk | solo corre el segundo |
removeEventListener de wool y luego click |
silk | silk | siguen corriendo los dos |
script de la página, un click |
ambos | wool silk | la línea termina en hang |
addEventListener("click", wool) pone wool al final de la lista de clic. No llama a wool. peg.click() dispara un clic y recorre la lista desde el principio. El texto del botón no cambia.
Si luego añades silk, se sienta detrás de wool. Las dos se ejecutan. El orden es el orden en que las añadiste.
El mismo objeto función no se añade dos veces. peg.addEventListener("click", wool) y otra vez la misma línea dejan una lista de uno. Un clic ejecuta wool una vez. parts.length es 1 y el ticket es wool.
removeEventListener("click", wool) quita ese objeto. silk se queda, si la añadiste. Una función nueva que también hace push de "wool" no coincide. Después de peg.removeEventListener("click", function () { parts.push("wool"); }) la wool original sigue en la lista. El clic sigue escribiendo wool.
join(" ") solo pone un espacio entre las palabras que ya están en parts. Aquí no unimos una lista vacía. El ticket empieza con la palabra blank y solo cambia dentro de un oyente.
Todavía no escucha nadie
El archivo abre con el botón y el párrafo. No hay oyente. El clic corre, y estos dos registros preguntan el ticket y la palabra del botón.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
peg.click();
console.log(ticket.textContent);
console.log(peg.textContent);
Los registros son blank y hang. La lista de clic estaba vacía. El párrafo no cambió.
El oyente espera
addEventListener guarda wool. El cuerpo no corre en esa línea. parts sigue vacío, el ticket sigue blank y el botón sigue diciendo hang.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
Los registros son blank, 0 y hang. wool está en la lista. Nadie la ha llamado, así que parts no tiene palabra.
click ejecuta a quien está en la lista
Este fragmento vuelve a empezar en el botón nuevo. Solo se añade wool y luego peg.click(). El ticket pasa a wool. El texto del botón sigue hang. parts.length es 1.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.click();
console.log(ticket.textContent);
console.log(peg.textContent);
console.log(parts.length);
Los registros son wool, hang y 1. Un oyente, una palabra. hang sigue siendo el botón.
silk se sienta junto a wool
Botón nuevo. Primero wool, luego silk, y solo entonces un click. No hay clic entre las dos altas. wool mete "wool" y lo escribe. silk mete "silk" y escribe las dos palabras con un espacio. El ticket es wool silk. parts.length es 2. El botón sigue hang.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.click();
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
Los registros son wool silk, 2 y hang. silk no borró a wool. Un clic recorrió la lista en el orden de alta.
Quitar wool de la percha
Botón nuevo. Se añaden las dos funciones y luego se llama a removeEventListener con la misma función wool. silk se queda. Un click ejecuta solo silk. El ticket es silk, no wool silk. parts.length es 1.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.removeEventListener("click", wool);
peg.click();
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
Los registros son silk, 1 y hang. wool era el mismo objeto que añadiste, así que salió de la lista. La demo de abajo no quita a nadie.
Una línea bajo la percha
El script está al final del body, cuando el botón y los párrafos ya existen. Añade wool, luego silk, y llama a click una vez. Cada función suma 1 a hits y mete su palabra. La línea junta el texto del ticket, la cuenta y peg.id. No escribe el texto del botón. No lee un argumento de evento.
<!DOCTYPE html>
<html>
<head>
<title>event-listeners — page</title>
</head>
<body>
<button id="peg" type="button">hang</button>
<p id="ticket">blank</p>
<p id="line">…</p>
<script>
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
let hits = 0;
function wool() {
hits = hits + 1;
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
hits = hits + 1;
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.click();
document.getElementById("line").textContent =
ticket.textContent + " / " + hits + " / " + peg.id;
</script>
</body>
</html>
La línea es wool silk / 2 / peg. El ticket es wool silk, no blank. La cuenta es 2, porque los dos oyentes corrieron en un clic. La última pieza es el id del botón, peg.id, no la palabra hang. En el botón sigue hang. La página siguiente es el objeto evento. Lee el argumento que estas funciones no toman.
Cinco comprobaciones en la percha
- Clic sin oyente. El ticket es blank y el botón es hang.
- Añade wool y no hagas clic. El ticket es blank,
parts.lengthes 0 y el botón es hang. - Añade wool y haz clic. El ticket es wool, el botón es hang y
parts.lengthes 1. - Añade wool, luego silk, y haz clic una vez. El ticket es wool silk,
parts.lengthes 2 y el botón es hang. - Añade los dos, quita wool y haz clic. El ticket es silk,
parts.lengthes 1 y el botón es hang. Lee la línea de la página: wool silk / 2 / peg.
Dónde engaña esta percha
En el botón sigue hang. La lista tenía las dos funciones, o solo silk, o a nadie.
- Esperar que el segundo
addEventListenersustituya al primero, como hacíaonclick - Esperar que el propio
addEventListenerponga el ticket en wool - Esperar que solo corra silk cuando las dos están añadidas
- Esperar que el texto del botón pase a wool
- Esperar que
removeEventListenercon una función nueva quite wool - Añadir la misma función
wooldos veces y esperar dos ejecuciones - Leer aquí
onclick,typeof nullothis.id; eso era la página del timbre - Leer aquí
event.target; estas funciones no reciben argumento y el objeto evento es la página siguiente - Construir el botón con
createElement; eso era una página anterior - Leer la línea como blank / 0 / hang
Qué se queda
- Sin oyente,
peg.click()deja el ticket en blank y el botón en hang addEventListenerdeja el ticket en blank hasta elclick- Un clic solo con wool pone el ticket en wool y deja el botón en hang
- wool, luego silk, luego un clic, pone el ticket en wool silk
removeEventListenercon la misma wool y luego el clic pone el ticket en silk- La misma wool añadida dos veces corre una vez, y una función nueva no la quita
- La línea de la página es wool silk / 2 / peg
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior