Подтвердить что ты не робот

Pure Javascript - сохранить объект в cookie

Нет jQuery.

Я хочу сохранить объект или массив в файле cookie.

Объект должен использоваться после обновления страницы.

Как мне сделать это с помощью чистого JavaScript? Я читал много сообщений, но не знаю, как правильно сериализовать.


EDIT: Код:

var instances = {};
...
instances[strInstanceId] = { container: oContainer };
...
instances[strInstanceId].plugin = oPlugin;
...
JSON.stringify(instances); 
// throws error 'TypeError: Converting circular structure to JSON'
  • Как сериализовать instances?

  • Как сохранить функциональность, но изменить структуру экземпляра, чтобы иметь возможность сериализации с помощью stringify?

4b9b3361

Ответ 1

Попробуйте написать

function bake_cookie(name, value) {
  var cookie = [name, '=', JSON.stringify(value), '; domain=.', window.location.host.toString(), '; path=/;'].join('');
  document.cookie = cookie;
}

Чтобы прочитать:

function read_cookie(name) {
 var result = document.cookie.match(new RegExp(name + '=([^;]+)'));
 result && (result = JSON.parse(result[1]));
 return result;
}

Чтобы удалить его, выполните:

function delete_cookie(name) {
  document.cookie = [name, '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.', window.location.host.toString()].join('');
}

Чтобы сериализовать сложные объекты/экземпляры, почему бы не написать функцию дампа данных в вашем экземпляре:

function userConstructor(name, street, city) {
   // ... your code
   this.dumpData = function() {
     return {
        'userConstructorUser': {
            name: this.name,
            street: this.street,
            city: this.city
         }
       }
    }

Затем вы выгружаете данные, строгаете их, записываете в файл cookie и в следующий раз, когда хотите использовать его, просто:

  var mydata = JSON.parse(read_cookie('myinstances'));
  new userConstructor(mydata.name, mydata.street, mydata.city);

Ответ 2

Если вы можете сериализовать свой объект в его каноническом строчном представлении и можете отменить его обратно в свою объектную форму из указанного строкового представления, тогда да вы можете поместить его в файл cookie.

Ответ 3

Используйте собственный метод .toString() объекта, если он дает значимую сериализацию или JSON.stringify(). Однако обратите внимание, что файлы cookie обычно ограничены по длине и не смогут хранить большие объемы данных.

Ответ 4

Класс адаптации файлов cookie: http://www.sitepoint.com/cookieless-javascript-session-variables/

Все, что вам нужно сделать, это установить и получить переменные, необходимые для хранения в cookie.

Работа с: int, string, array, list, Complex object

Exemple:

var toStore =  Session.get('toStore');

if (toStore == undefined)
    toStore = ['var','var','var','var'];
else
    console.log('Restored from cookies'+toStore);

Session.set('toStore', toStore);

Класс:

// Cross reload saving
if (JSON && JSON.stringify && JSON.parse) var Session = Session || (function() {
// session store

var store = load();

function load()
{
    var name = "store";
    var result = document.cookie.match(new RegExp(name + '=([^;]+)'));

    if (result)
        return JSON.parse(result[1]);

    return {};
}

function Save() {
    var date = new Date();
    date.setHours(23,59,59,999);
    var expires = "expires=" + date.toGMTString();
    document.cookie = "store="+JSON.stringify(store)+"; "+expires;
};

// page unload event
if (window.addEventListener) window.addEventListener("unload", Save, false);
else if (window.attachEvent) window.attachEvent("onunload", Save);
else window.onunload = Save;

// public methods
return {

    // set a session variable
    set: function(name, value) {
        store[name] = value;
    },

    // get a session value
    get: function(name) {
        return (store[name] ? store[name] : undefined);
    },

    // clear session
    clear: function() { store = {}; }
};
})();