Eventos
Manejo de interaccion del usuario
Eventos en JavaScript
Los eventos son acciones que ocurren en el navegador - clics, teclas presionadas, movimientos del mouse, carga de pagina, etc. JavaScript puede "escuchar" y responder a estos eventos.
Agregando Event Listeners
const boton = document.querySelector("#mi-boton");
// Metodo preferido: addEventListener
boton.addEventListener("click", function(evento) {
console.log("Boton clickeado!");
});
// Con funcion flecha
boton.addEventListener("click", (e) => {
console.log("Click!", e.target);
});
// Funcion nombrada (permite remover despues)
function manejarClick(e) {
console.log("Click!");
}
boton.addEventListener("click", manejarClick);
boton.removeEventListener("click", manejarClick);
Tipos de Eventos Comunes
// Eventos de mouse
elemento.addEventListener("click", fn);
elemento.addEventListener("dblclick", fn);
elemento.addEventListener("mouseenter", fn);
elemento.addEventListener("mouseleave", fn);
elemento.addEventListener("mousemove", fn);
// Eventos de teclado
document.addEventListener("keydown", fn);
document.addEventListener("keyup", fn);
document.addEventListener("keypress", fn); // Obsoleto
// Eventos de formulario
formulario.addEventListener("submit", fn);
input.addEventListener("input", fn);
input.addEventListener("change", fn);
input.addEventListener("focus", fn);
input.addEventListener("blur", fn);
// Eventos de ventana
window.addEventListener("load", fn);
window.addEventListener("resize", fn);
window.addEventListener("scroll", fn);
document.addEventListener("DOMContentLoaded", fn);
El Objeto Evento
boton.addEventListener("click", function(evento) {
// Propiedades comunes
console.log(evento.type); // "click"
console.log(evento.target); // Elemento clickeado
console.log(evento.currentTarget); // Elemento con el listener
// Posicion del mouse
console.log(evento.clientX, evento.clientY); // Relativo a ventana
console.log(evento.pageX, evento.pageY); // Relativo a documento
// Teclas modificadoras
console.log(evento.shiftKey); // true si Shift presionado
console.log(evento.ctrlKey); // true si Ctrl presionado
console.log(evento.altKey); // true si Alt presionado
});
// Para eventos de teclado
document.addEventListener("keydown", (e) => {
console.log(e.key); // "Enter", "a", "ArrowUp", etc.
console.log(e.code); // "Enter", "KeyA", "ArrowUp", etc.
console.log(e.keyCode); // Obsoleto, evitar
});
Previniendo Comportamiento por Defecto
// Prevenir envio de formulario
formulario.addEventListener("submit", (e) => {
e.preventDefault();
// Manejar envio con JavaScript
});
// Prevenir navegacion de enlace
enlace.addEventListener("click", (e) => {
e.preventDefault();
// Hacer algo mas
});
// Detener propagacion (bubbling)
elemento.addEventListener("click", (e) => {
e.stopPropagation();
// El evento no llegara a elementos padre
});
Delegacion de Eventos
// En vez de agregar listener a cada item...
// Agrega uno al contenedor padre
const lista = document.querySelector("#lista");
lista.addEventListener("click", (e) => {
// Verificar si el click fue en un item
if (e.target.matches(".item")) {
console.log("Item clickeado:", e.target.textContent);
}
// O usando closest para elementos anidados
const item = e.target.closest(".item");
if (item) {
console.log("Item:", item);
}
});
// Ventajas:
// - Un solo listener en vez de muchos
// - Funciona con elementos agregados dinamicamente
// - Mejor rendimiento