El Atributo ONSTORAGE

El evento storage se dispara cuando se modifican los datos en localStorage o sessionStorage desde otra pestaña o ventana del mismo origen.
El evento storage
se dispara cuando se modifican los datos en localStorage
o sessionStorage
desde otra pestaña o ventana del mismo origen. Es útil para:
-
Sincronizar estados entre pestañas.
-
Actualizar interfaces en tiempo real.
-
Implementar sistemas de notificaciones entre ventanas.
-
Gestionar sesiones compartidas.
???? Características clave
-
No se activa en la misma pestaña: Solo detecta cambios realizados desde otras pestañas/ventanas.
-
Requiere el mismo origen: Las pestañas deben compartir el mismo dominio, protocolo y puerto.
-
Información del cambio: Proporciona detalles sobre la clave modificada, valor antiguo y nuevo.
???? Sintaxis básica
1. Escuchar cambios en el almacenamiento
window.addEventListener("storage", (event) => { console.log("Cambio detectado en el almacenamiento:", event); });
2. Propiedades del evento storage
Propiedad | Descripción |
---|---|
key |
Nombre de la clave modificada (null si se usó localStorage.clear() ) |
oldValue |
Valor anterior de la clave (si existía) |
newValue |
Nuevo valor de la clave (si se eliminó, será null ) |
url |
URL de la página que realizó el cambio |
storageArea |
Objeto afectado (localStorage o sessionStorage ) |
???? Ejemplos prácticos
1. Sincronizar tema oscuro entre pestañas
// Escuchar cambios en el almacenamiento window.addEventListener("storage", (event) => { if (event.key === "tema-oscuro") { const tema = event.newValue === "true"; aplicarTema(tema); } }); // Función para cambiar el tema function aplicarTema(temaOscuro) { document.body.classList.toggle("tema-oscuro", temaOscuro); } // Guardar preferencia (ejemplo desde otra pestaña) localStorage.setItem("tema-oscuro", "true");
2. Actualizar lista de tareas en tiempo real
// Escuchar cambios en la clave "tareas" window.addEventListener("storage", (event) => { if (event.key === "tareas") { const tareas = JSON.parse(event.newValue || "[]"); renderizarTareas(tareas); } }); // Función para renderizar function renderizarTareas(tareas) { const lista = document.getElementById("lista-tareas"); lista.innerHTML = tareas.map(t => `<li>${t}</li>`).join(""); } // Ejemplo de modificación desde otra pestaña: localStorage.setItem("tareas", JSON.stringify(["Comprar leche", "Estudiar"]));
⚠️ Consideraciones importantes
1. Limitaciones
-
No se activa en la misma pestaña: El evento solo se dispara en otras ventanas/pestañas.
-
Datos como cadenas:
localStorage
almacena solo strings. UsaJSON.parse
yJSON.stringify
para objetos. -
Cuota de almacenamiento: Límite de ~5-10 MB por dominio (depende del navegador).
2. Seguridad
-
Política de mismo origen: Solo pestañas del mismo dominio pueden acceder a los datos.
-
No usar para datos sensibles:
localStorage
es accesible vía JavaScript y vulnerable a XSS.
???? Casos de uso avanzados
1. Sistema de autenticación compartida
// Escuchar cambios en el token de autenticación window.addEventListener("storage", (event) => { if (event.key === "auth-token" && event.newValue === null) { // Cerrar sesión en todas las pestañas si el token se elimina redirigirALogin(); } }); // Cerrar sesión desde cualquier pestaña: localStorage.removeItem("auth-token");
2. Chat entre pestañas
// Escuchar nuevos mensajes window.addEventListener("storage", (event) => { if (event.key === "chat-mensajes") { const mensajes = JSON.parse(event.newValue || "[]"); mostrarMensajes(mensajes); } }); // Enviar mensaje (ejemplo): function enviarMensaje(texto) { const mensajes = JSON.parse(localStorage.getItem("chat-mensajes") || "[]"); mensajes.push(texto); localStorage.setItem("chat-mensajes", JSON.stringify(mensajes)); }
???? Troubleshooting común
1. El evento no se dispara
-
Verifica que las pestañas compartan el mismo origen (
http://
vshttps://
cuenta como diferente). -
Asegúrate de no estar probando en la misma pestaña donde se modifica el almacenamiento.
2. Valores undefined
o errores de formato
-
Usa siempre
JSON.parse
/JSON.stringify
para objetos:// Guardar localStorage.setItem("usuario", JSON.stringify({ nombre: "Ana" })); // Leer const usuario = JSON.parse(localStorage.getItem("usuario"));
???? Conclusión
El evento storage
permite:
-
Crear experiencias multi-pestaña coherentes.
-
Sincronizar datos en tiempo real sin servidores.
-
Implementar funcionalidades colaborativas.
Ejemplo final avanzado (Carrito de compras sincronizado):
// Escuchar cambios en el carrito window.addEventListener("storage", (event) => { if (event.key === "carrito") { const carrito = JSON.parse(event.newValue || "[]"); actualizarCarritoUI(carrito); } }); // Función para añadir producto function agregarAlCarrito(producto) { const carrito = JSON.parse(localStorage.getItem("carrito") || "[]"); carrito.push(producto); localStorage.setItem("carrito", JSON.stringify(carrito)); } // Función para limpiar carrito function vaciarCarrito() { localStorage.removeItem("carrito"); }
Con este conocimiento, podrás crear aplicaciones web que mantengan un estado consistente entre múltiples instancias del navegador. ¡Experimenta y lleva tu desarrollo al siguiente nivel! ????????