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

Javascript存储/全局数据/对象的状态,javascript,dom,cross-browser,browser,Javascript,Dom,Cross Browser,Browser,是否有方法将全局数据存储在窗口对象中,以便数据能够在页面重新加载/刷新后继续保存。假设我分配了全局数据/对象- window.myObject = myProductObject 用户刷新/重新加载页面,或者可能跳转到我网站的另一个页面。重新加载页面后,window.myObject是否仍然可用 注意-:我无法将该对象存储在cookie中,因为它是一个对象,我的意思是它可以是对另一个自定义对象的引用,或者它可以引用通过“window.open”打开的另一个“window”对象。如果对象仅由值组

是否有方法将全局数据存储在
窗口
对象中,以便数据能够在页面重新加载/刷新后继续保存。假设我分配了全局数据/对象-

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


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

如果对象仅由值组成,则可以尝试将对象的字符串表示形式存储在cookie中(没有方法),例如


这里有一个很好的cookie阅读器/编写器示例-

我不确定这是如何跨浏览器的。我至少在chrome、firefox、IE9和IE8/7兼容模式下可以使用它,但你会收到弹出窗口的警告。你可以检测弹出窗口是否被阻止,并拒绝加载任何内容,直到它们为你的站点启用。请参阅

我使用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();    
});
示例:(刷新页面几次)

正如@Raynos所要求的——持久的关闭状态——一些你不能序列化的东西(至少在firefox和chrome中有效,IE称之为安全问题,但可能与JSFIDLE如何使用框架有关)

免责声明:我不能保证此解决方案的优雅。我只是好奇如何使用弹出窗口来持久化对象状态。将对象序列化为JSON并将其存储在客户端存储中要好得多(@Raynos建议使用lawnchair)。如果可以的话,您应该避免使用cookies,因为这些数据会被发回服务器,这可能并不理想


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

您可以将对象保存在cookie中。但是本地存储更好。与cookie类似,但您可以使用5Mb

如果保存对象而不是字符串,则必须进行JSON编码/解码,但在localStorage或cookie上使用包装器很容易

下面是一个非常简单的localStorage包装器(您有5Mb可供使用):

您可以这样使用它:

$(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上尝试它:

使用
窗口.top.name
hack

var data = window.top.name ? JSON.parse(window.top.name) : {}
...
window.top.name = JSON.stringify(data)
window.top.name
在页面加载过程中保持不变


我建议您使用一种抽象,例如,如果需要将对象字符串化,则将其字符串化:客户端存储的唯一真正解决方案是IndexedBal,因此您可以读取此Cookie是错误的solution@Raynos想详细说明一下吗?这可能不是最新的解决方案(本地存储非常酷,但我是老斯库尔,没有立即想到)但是Cookie是这个问题的解决方案Cookie随每个HTTP请求一起发送,增加了带宽和延迟。无论如何,如果您需要服务器和客户端上的数据,这是一个正确的解决方案,如果您只需要客户端上的数据,这是一个糟糕的解决方案solution@Raynos记住静物(包括IE7)不支持本地存储。根据OP的要求,它甚至可能不是一个选项。对于IE7支持,有比Cookie更好的破解方法,
window.top.name
userData
。也不要通过网络发送您存储的Cookie。使用弹出式窗口的持久状态非常简单。无需在更少的时间内重复lpful术语。答案是一个推荐的解决方案,而不是关于如何解决它的学术旁白。如果你读了这个问题,你可能会注意到这个答案实际上回答了这个问题。这也是真正保持状态的唯一方法,因为JSON并没有像OP中提到的那样封装整个状态。理想的解决方案是这样做这是不同的,但要解决OP要求的给定约束的问题,这是唯一的方法。如果您需要保持不可服务的状态,或者决定要,无论出于什么原因,OP要求,这是唯一的方法。我希望OP从解决方案的丑陋性中看出,这是一个更好的方法考虑一种不同的方法,但我不打算做出这样的决定。TIL-<代码>窗口.Top.Name >代码>和椅子。希望我可以2。
$(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
});
​
var data = window.top.name ? JSON.parse(window.top.name) : {}
...
window.top.name = JSON.stringify(data)