SessionStorage и LocalStorage позволяют сохранять пары ключ / значение в веб-браузере. Значение должно быть строкой, а сохранение объектов js не является тривиальным.
var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object
В настоящее время вы можете обойти это ограничение, сериализовав объекты в JSON, а затем десериализовав их для восстановления объектов. Но Storage API всегда проходят через setItem
и getItem
методы.
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D
Могу ли я избежать этого ограничения?
Я просто хочу выполнить что-то вроде этого:
sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'
Я попробовал defineGetter
и defineSetter
методы перехвата вызовов , но его утомительную работу, потому что я должен определить все свойства и моя цель не знать свойство будущего.
javascript
session-storage
Ферран Басора
источник
источник
Ответы:
Либо вы можете использовать средства доступа, предоставляемые API-интерфейсом веб-хранилища, либо написать оболочку / адаптер. Из вашей заявленной проблемы с defineGetter / defineSetter звучит так, будто написание оболочки / адаптера - слишком много работы для вас.
Я, честно говоря, не знаю, что тебе сказать. Может быть, вы могли бы переоценить свое мнение о том, что является «смешным ограничением». API веб-хранилища - это то, чем он должен быть, хранилище ключей / значений.
источник
Не могли бы вы «зачеркнуть» ваш объект ... затем использовать
sessionStorage.setItem()
для хранения этого строкового представления вашего объекта ... затем, когда вам это нужно,sessionStorage.getItem()
и затем использовать$.parseJSON()
для его возврата?Рабочий пример http://jsfiddle.net/pKXMa/
источник
Решение состоит в том, чтобы привести в соответствие объект перед вызовом setItem в sessionStorage.
источник
Это динамическое решение, которое работает со всеми типами значений, включая объекты:
Затем :
источник
Случай использования:
API
источник
if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
Хранилище сеансов не может поддерживать произвольный объект, поскольку оно может содержать функциональные литералы (замыкания на чтение), которые невозможно восстановить после перезагрузки страницы.
источник
источник
Вы также можете использовать библиотеку магазина, которая выполняет ее для вас с кроссбраузерной способностью.
пример :
источник
Вы можете создать 2 метода-обертки для сохранения и извлечения объекта из хранилища сессии.
Используйте это так: - Получить объект, изменить некоторые данные и сохранить обратно.
источник