Хранение JavaScript / состояние глобальных данных / объекта - PullRequest
3 голосов
/ 11 марта 2012

Есть ли способ сохранить глобальные данные в объекте window, чтобы данные могли выдержать перезагрузку / обновление страницы.Допустим, я назначаю свои глобальные данные / объект -

window.myObject = myProductObject

И пользователь обновляет / перезагружает страницу или может перейти на другую страницу моего сайта.window.myObject по-прежнему доступен после перезагрузки страницы?

ПРИМЕЧАНИЕ -: я не могу сохранить объект в файле cookie, поскольку он является объектом, я имею в виду, что он может быть ссылкой на другой пользовательский объект.объект или это может ссылаться на другой объект "окна", который открылся через "window.open"

Ответы [ 4 ]

5 голосов
/ 11 марта 2012

Используйте window.top.name взломать

var data = window.top.name ? JSON.parse(window.top.name) : {}
...
window.top.name = JSON.stringify(data)

window.top.name сохраняется при загрузке страниц

Я рекомендую вам использовать абстракцию как шезлонг вместо

3 голосов
/ 11 марта 2012

Вы можете сохранять объекты в куки. Но localStorage лучше. Похож на cookie, но вы получаете 5 Мб для использования.

Вы должны JSON кодировать / декодировать, если вы сохраняете объекты вместо строк, но это легко сделать с помощью оболочки на localStorage или cookie.

Вот действительно простая оболочка для localStorage (у вас есть 5Mb для использования):

var Storage = {
    set: function(key, value) {
        localStorage[key] = JSON.stringify(value);
    },
    get: function(key) {
        return localStorage[key] ? JSON.parse(localStorage[key]) : null;
    }
};

И вы можете использовать его так:

$(function() {
    var defaultValue = {param1: 'value',counter: 0 },
        myObj = Storage.get('myObj') || defaultValue; // get the obj from storage or create it with default values

    $('body').html('counter: ' + myObj.counter);
    myObj.counter+=1; // increment counter 
    Storage.set('myObj', myObj); // save it to localStorage
});
​

Вы можете попробовать это на jsFiddle: http://jsfiddle.net/guumaster/LytzA/3/

1 голос
/ 11 марта 2012

Я не уверен, как это ярмарка кросс-браузерная. Я по крайней мере заставил его работать в Chrome, Firefox и IE9 и IE8 / 7 в режиме совместимости, но вы будете предупреждены о всплывающих окнах. Вы можете определить, заблокированы ли всплывающие окна, и отказаться от загрузки чего-либо до тех пор, пока они не будут включены для вашего сайта. См. Обнаружение заблокированного всплывающего окна в Chrome

Я использую jQuery для привязки к событию beforeunload, вы можете использовать предпочитаемое вами решение.

jQuery(function ($) {
    $(window).bind('beforeunload', function () {
        window.open("", "_savedata", "titlebar=0,width=100,height=100").saveData = window.saveData;
    });

    var store = window.open("", "_savedata");      
    window.saveData = store.saveData;
    store.close();    
});

Пример: (обновить страницу несколько раз)

http://jsfiddle.net/hZVss/1/

И по запросу @Raynos - состояние постоянного закрытия - что-то, что вы не можете сериализовать (по крайней мере, работает в firefox и chrome, IE называет это проблемой безопасности, но может быть связано с тем, как jsfiddle использует фреймы)

http://jsfiddle.net/ght9f/2/

Отказ от ответственности : я бы не ручался за элегантность этого решения. Мне было просто любопытно, как сохранить состояние объекта с помощью всплывающих окон. Сериализация вашего объекта в JSON и его хранение в хранилище на стороне клиента гораздо лучше (@Raynos рекомендует использовать газонное кресло https://github.com/brianleroux/lawnchair/). Если вы можете, то следует избегать использования файлов cookie, поскольку эти данные отправляются обратно на сервер, что может быть не идеально .

Если вашей главной целью было сохранение ссылок на всплывающие окна, вы можете сделать это, дав всплывающему окну имя. Именно так я сохраняю свою ссылку на всплывающее окно, которое я создаю при обновлении.

1 голос
/ 11 марта 2012

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

var foo = { a: "a", b: "b" };
document.cookie = "foo=" + JSON.stringify(foo);

Здесь есть хороший пример чтения / записи файлов cookie - https://developer.mozilla.org/en/DOM/document.cookie

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...