SessionStorage y LocalStorage permite guardar pares clave / valor en un navegador web. El valor debe ser una cadena y guardar objetos js no es trivial.
var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object
Hoy en día, puede evitar esta limitación al serializar objetos en JSON y luego deserializarlos para recuperar los objetos. Pero la API de almacenamiento siempre pasa por los métodos setItem
y getItem
.
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D
¿Puedo evitar esta limitación?
Solo quiero ejecutar algo como esto:
sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'
He intentado los métodos defineGetter
y defineSetter
para interceptar las llamadas, pero es un trabajo tedioso, porque tengo que definir todas las propiedades y mi objetivo es no conocer las propiedades futuras.
javascript
session-storage
Ferran Basora
fuente
fuente
Respuestas:
Puede usar los accesores proporcionados por la API de almacenamiento web o puede escribir un contenedor / adaptador. Según su problema declarado con defineGetter / defineSetter, parece que escribir un contenedor / adaptador es demasiado trabajo para usted.
Sinceramente, no sé qué decirte. Tal vez podría reevaluar su opinión sobre lo que es una "limitación ridícula". La API de almacenamiento web es justo lo que se supone que es, un almacén de clave / valor.
fuente
¿No podría 'encadenar' su objeto ... luego usarlo
sessionStorage.setItem()
para almacenar esa representación de cadena de su objeto ... luego cuando lo necesitesessionStorage.getItem()
y luego usar$.parseJSON()
para recuperarlo?Ejemplo de trabajo http://jsfiddle.net/pKXMa/
fuente
La solución es stringificar el objeto antes de llamar a setItem en sessionStorage.
fuente
Esta es una solución dinámica que funciona con todos los tipos de valores, incluidos los objetos:
Luego :
fuente
Caso de uso:
API
fuente
if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
El almacenamiento de la sesión no puede admitir un objeto arbitrario porque puede contener literales de función (cierres de lectura) que no se pueden reconstruir después de una recarga de página.
fuente
fuente
También puede usar la biblioteca de la tienda que lo realiza para usted con la capacidad de crossbrowser.
ejemplo:
fuente
Puede crear 2 métodos de contenedor para guardar y recuperar objetos del almacenamiento de la sesión.
Úselo así: - Obtenga un objeto, modifique algunos datos y guarde de nuevo.
fuente