SessionStorage i LocalStorage umożliwiają zapisywanie par klucz / wartość w przeglądarce internetowej. Wartość musi być łańcuchem, a save js obiektów nie jest trywialny.
var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object
Obecnie można uniknąć tego ograniczenia, serializując obiekty do formatu JSON, a następnie deserializując je w celu odzyskania obiektów. Ale interfejs API magazynu zawsze przechodzi przez metody setItem
i getItem
.
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D
Czy mogę uniknąć tego ograniczenia?
Chcę tylko wykonać coś takiego:
sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'
Wypróbowałem metody defineGetter
i defineSetter
do przechwytywania wywołań, ale jest to żmudna praca, ponieważ muszę zdefiniować wszystkie właściwości, a moim celem nie jest znajomość przyszłych właściwości.
javascript
session-storage
Ferran Basora
źródło
źródło
Odpowiedzi:
Możesz użyć metod dostępu udostępnianych przez interfejs API usługi Web Storage lub napisać opakowanie / adapter. Z twojego stwierdzonego problemu z defineGetter / defineSetter wynika, że napisanie wrappera / adaptera to dla ciebie za dużo pracy.
Naprawdę nie wiem, co ci powiedzieć. Może mógłbyś zrewidować swoją opinię o tym, co jest „śmiesznym ograniczeniem”. Interfejs API usługi Web Storage jest tym, czym powinien być, magazynem kluczy / wartości.
źródło
Czy nie mógłbyś 'stringify' swojego obiektu ... potem użyć
sessionStorage.setItem()
do przechowywania reprezentacji ciągu twojego obiektu ... potem, kiedy tego potrzebujesz,sessionStorage.getItem()
a następnie użyć,$.parseJSON()
aby go odzyskać?Przykład roboczy http://jsfiddle.net/pKXMa/
źródło
Rozwiązaniem jest określenie ciągu obiektu przed wywołaniem setItem w sessionStorage.
źródło
Jest to dynamiczne rozwiązanie, które działa ze wszystkimi typami wartości, w tym obiektami:
Następnie :
źródło
Przypadek użycia:
API
źródło
if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
Magazyn sesji nie może obsługiwać dowolnego obiektu, ponieważ może zawierać literały funkcyjne (zamknięcia odczytu), których nie można odtworzyć po przeładowaniu strony.
źródło
źródło
Możesz także skorzystać z biblioteki sklepu, która wykonuje to za Ciebie z możliwością obsługi różnych przeglądarek.
przykład:
źródło
Możesz utworzyć dwie metody opakowujące do zapisywania i pobierania obiektów z pamięci sesji.
Użyj tego w ten sposób: - Pobierz obiekt, zmodyfikuj niektóre dane i zapisz z powrotem.
źródło