Javascript存储/全局数据/对象的状态
Javascript storing/state of global data/object
是否有一种方法可以将全局数据存储在window
对象中,以便数据能够在页面重新加载/刷新后继续存在。假设我分配全局数据/对象-
window.myObject = myProductObject
用户刷新/重新加载页面,或者可能会跳转到我网站的另一个页面。页面重新加载后,window.myObject
是否仍然可用?
注意-:我无法将对象存储在cookie中,因为它是一个对象,我的意思是它可能是对另一个自定义对象的引用,也可能是对通过"window.open"打开的另一个"window"对象的引用
使用window.top.name
破解
var data = window.top.name ? JSON.parse(window.top.name) : {}
...
window.top.name = JSON.stringify(data)
window.top.name
在页面加载期间持续存在
我建议您使用像lawnchair这样的抽象,而不是
您可以将对象保存在cookie中。但是localStorage更好。类似于饼干,但您可以使用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/
您可以尝试将对象的字符串表示存储在cookie中,前提是对象仅由值组成(没有方法),例如
var foo = { a: "a", b: "b" };
document.cookie = "foo=" + JSON.stringify(foo);
这里有一个很好的cookie读写器示例-https://developer.mozilla.org/en/DOM/document.cookie
我不确定这是如何在跨浏览器中显示的。我至少让它在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建议使用lawnchairhttps://github.com/brianleroux/lawnchair/)。如果可以的话,你应该避免cookie,因为这些数据会被发布回服务器,这可能并不理想。
如果你的主要目标是保持对弹出窗口的引用,你实际上可以通过给弹出窗口一个名称来做到这一点。这正是我坚持引用刷新时创建的弹出窗口的方式。
- js,对象's状态监视
- redux 中状态对象的结构
- 如何将状态对象/数据传递给(异步)ajax 回调
- 你能在js中获得以前的历史状态对象吗
- 更新HTML5历史中以前的状态对象
- stampit.js“状态”对象不是实例安全的
- 相位器.js获取给定的无效相位器状态对象
- 使用 React 创建的表单不会更新支持状态对象
- AngularJs :将 stateParams 值附加到状态对象中的自定义数据
- Redux 的 .getState() 不应该返回状态对象的副本
- Nodejs使用回调函数缓存有状态对象
- 我可以只返回状态对象的一部分而不是整个状态对象的新副本吗
- 处理一个巨大的状态对象
- 访问pushState状态对象内容
- 调用mapStateToProps似乎传递了错误的状态对象
- 试图通过将状态对象放入变量来压缩我的ui-router状态定义.并# 39;t工作
- React路由器-动态路由-通过路由器访问状态对象
- HTML5历史API-状态对象的最大大小是多少
- React:您可以将setState与现有的状态对象一起使用吗
- Pubnub:无法获得带有存在事件的状态对象