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
?
Ответы
Ответ 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 = {}; }
};
})();