SessionStorage e LocalStorage permitem salvar pares de chave / valor em um navegador da web. O valor deve ser uma sequência e salvar objetos js não é trivial.
var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object
Atualmente, você pode evitar essa limitação serializando objetos para JSON e desserializando-os para recuperar os objetos. Mas a API de armazenamento sempre passa pelos métodos setItem
e getItem
.
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D
Posso evitar essa limitação?
Eu só quero executar algo como isto:
sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'
Eu tentei os métodos defineGetter
e defineSetter
para interceptar as chamadas, mas é um trabalho tedioso, porque tenho que definir todas as propriedades e meu objetivo é não conhecer as propriedades futuras.
javascript
session-storage
Ferran Basora
fonte
fonte
Respostas:
Você pode usar os acessadores fornecidos pela API de armazenamento na Web ou escrever um wrapper / adaptador. Do problema declarado com defineGetter / defineSetter, parece que escrever um wrapper / adaptador é muito trabalhoso para você.
Sinceramente, não sei o que lhe dizer. Talvez você possa reavaliar sua opinião sobre o que é uma "limitação ridícula". A API de armazenamento na Web é exatamente o que deveria ser, um armazenamento de chave / valor.
fonte
Você não poderia 'restringir' o seu objeto ... depois usar
sessionStorage.setItem()
para armazenar essa representação de string do seu objeto ... quando precisarsessionStorage.getItem()
e depois usá$.parseJSON()
-lo para recuperá-lo?Exemplo de trabalho http://jsfiddle.net/pKXMa/
fonte
A solução é restringir o objeto antes de chamar setItem no sessionStorage.
fonte
Esta é uma solução dinâmica que funciona com todos os tipos de valores, incluindo objetos:
Então :
fonte
Caso de uso:
API
fonte
if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
O armazenamento da sessão não pode suportar um objeto arbitrário porque pode conter literais de função (fechamentos de leitura) que não podem ser reconstruídos após o recarregamento de uma página.
fonte
fonte
Você também pode usar a biblioteca da loja que executa para você com capacidade de navegação cruzada.
exemplo:
fonte
Você pode criar 2 métodos de wrapper para salvar e recuperar objetos do armazenamento da sessão.
Use-o assim: - Obtenha um objeto, modifique alguns dados e salve de volta.
fonte