Сохранить объекты Javascript в sessionStorage - PullRequest
133 голосов
/ 01 июня 2011

SessionStorage и LocalStorage позволяют сохранять пары ключ / значение в веб-браузере.Значение должно быть строкой, и сохранение объектов js не является тривиальным.

var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object

В настоящее время вы можете обойти это ограничение, сериализовав объекты в JSON, а затем десериализовав их для восстановления объектов.Но 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 для перехвата вызовов, но это утомительная работа, потому что я должен определить все свойства, а моя цель - не знать будущие свойства.

Ответы [ 8 ]

103 голосов
/ 26 апреля 2012

Не могли бы вы "зачеркнуть" свой объект ... затем использовать sessionStorage.setItem() для хранения этого строкового представления вашего объекта ... затем, когда вам это нужно sessionStorage.getItem(), а затем использовать $.parseJSON(), чтобы вернуть его обратно?

Рабочий пример http://jsfiddle.net/pKXMa/

81 голосов
/ 02 октября 2015

Решение состоит в том, чтобы привести в соответствие объект перед вызовом setItem для sessionStorage.

var user = {'name':'John'};
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.user);
17 голосов
/ 01 июня 2011

Либо вы можете использовать средства доступа, предоставляемые API-интерфейсом веб-хранилища, либо написать оболочку / адаптер.Из вашей заявленной проблемы с defineGetter / defineSetter звучит так, будто написание обертки / адаптера - слишком большая работа для вас.

Честно говоря, я не знаю, что вам сказать.Может быть, вы могли бы переоценить свое мнение о том, что является «нелепым ограничением».API веб-хранилища - это то, чем он должен быть, хранилище ключей / значений.

8 голосов
/ 15 марта 2017

Это динамическое решение, которое работает со всеми типами значений, включая объекты:

class Session extends Map {
  set(id, value) {
    if (typeof value === 'object') value = JSON.stringify(value);
    sessionStorage.setItem(id, value);
  }

  get(id) {
    const value = sessionStorage.getItem(id);
    try {
      return JSON.parse(value);
    } catch (e) {
      return value;
    }
  }
}

Тогда:

const session = new Session();

session.set('name', {first: 'Ahmed', last : 'Toumi'});
session.get('name');
5 голосов
/ 26 ноября 2014

Вариант использования:

 sesssionStorage.setObj(1,{date:Date.now(),action:'save firstObject'});
 sesssionStorage.setObj(2,{date:Date.now(),action:'save 2nd object'}); 
 //Query first object
  sesssionStorage.getObj(1)
  //Retrieve date created of 2nd object
  new Date(sesssionStorage.getObj(1).date)

API

Storage.prototype.setObj = function(key, obj) {

        return this.setItem(key, JSON.stringify(obj))
    };

    Storage.prototype.getObj = function(key) {
        return JSON.parse(this.getItem(key))
    };
4 голосов
/ 23 мая 2018

Сеансовое хранилище не может поддерживать произвольный объект, поскольку оно может содержать функциональные литералы (замыкания на чтение), которые невозможно восстановить после перезагрузки страницы.

3 голосов
/ 19 января 2016
    var user = {'name':'John'};
    sessionStorage['user'] = JSON.stringify(user);
    console.log(sessionStorage['user']);
2 голосов
/ 11 октября 2017

Вы также можете использовать библиотеку store , которая выполняет ее для вас с возможностью кроссбраузера.

пример:

// Store current user
store.set('user', { name:'Marcus' })

// Get current user
store.get('user')

// Remove current user
store.remove('user')

// Clear all keys
store.clearAll()

// Loop over all stored values
store.each(function(value, key) {
    console.log(key, '==', value)
})
...