Javascript存储/全局数据/对象的状态

时间:2012-03-11 03:06:00

标签: javascript dom cross-browser browser

是否有办法将全局数据存储在window对象中,以便数据可以在页面重新加载/刷新后继续存在。所以我要说我分配我的全局数据/对象 -

window.myObject = myProductObject

用户刷新/重新加载页面或者可能会跳转到我网站的另一个页面。页面重新加载后window.myObject是否仍然可用?

注意 - :我无法将对象存储在cookie中,因为它是一个对象,我的意思是它可能是对另一个自定义对象的引用,或者它可能引用另一个“窗口”对象通过“window.open”打开

4 个答案:

答案 0 :(得分:5)

使用window.top.name黑客

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

window.top.name在页面加载中持续存在

我建议您使用lawnchair这样的抽象,而不是

答案 1 :(得分:3)

您可以将对象保存在Cookie中。但localStorage更好。类似于cookie,但你可以使用5Mb。

如果保存对象而不是字符串,则必须进行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/

答案 2 :(得分:1)

您可以尝试将对象的字符串表示形式存储在cookie中,前提是该对象仅由值组成(无方法),例如

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

这里有一个很好的cookie读者/作者示例 - https://developer.mozilla.org/en/DOM/document.cookie

答案 3 :(得分:1)

我不确定这个展会如何跨浏览器。我至少在兼容模式下使用chrome,firefox和IE9以及IE8 / 7工作,但是你会收到关于弹出窗口的警告。您可以检测弹出窗口是否被阻止,并且在为您的站点启用之前拒绝加载任何内容。见Detect blocked popup in 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如何使用框架有关)< / p>

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

免责声明:我不保证这个解决方案的优雅。我只是对使用弹出窗口持久化对象状态感到好奇。将对象序列化为JSON并将其存储在客户端商店中要好得多(@Raynos会推荐草坪https://github.com/brianleroux/lawnchair/)。如果可以,您应该避免使用cookie,因为这些数据会被发布回服务器,这可能并不理想。

如果您的主要目标是持久引用弹出窗口,您可以通过为弹出窗口命名来实现此目的。这正是我持续引用我在刷新时创建的弹出窗口的方式。