使用 window 对象进行会话存储而不是 AmplifyJS 存储
Posted
技术标签:
【中文标题】使用 window 对象进行会话存储而不是 AmplifyJS 存储【英文标题】:Using the window object for session storage instead of AmplifyJS store 【发布时间】:2013-06-11 12:50:39 【问题描述】:我正在使用 AmplifyJS 商店。我认为它是持久存储的一个很好的包装器。我一直在 JQuery 插件中使用它,效果很好。
不过,最近我一直在想,我是否可以使用 window
对象中的命名空间变量来做同样的事情?!
AmplifyJS Store + JSON2.js(数据序列化所需)仅花费了我 22Kb(缩小为 8Kb)的文件大小,更不用说我必须围绕它创建的额外支持代码了。另外,我只使用 sessionStorage (即在浏览器窗口关闭后我不需要持久性,只有在窗口处于活动状态时)。
那么,对于我的具体情况,我不能使用window
对象而不是 AmplifyJS Store 真的有什么主要原因吗?!我已经考虑过expiry
功能,但我可以通过几行代码轻松构建相同的功能。
谢谢。
【问题讨论】:
存储在窗口上的任何东西都不是持久的。您重新加载页面或点击链接,您将丢失所有数据。 @bfavaretto 谢谢。你能把它作为答案发布吗?!干杯。 由于另一个用户已经这样做了,我赞成他的回答。 @bfavaretto 好的。干杯。 【参考方案1】:html5 localStorage in window object by itslef 有一个非常简单的 api:
var valueOfName = window.localStorage.getItem("name");
window.localStorage.setItem("name", "value");
你甚至可以省略全局窗口对象:
var valueOfName = localStorage.getItem("name");
localStorage.setItem("name", "val");
此外,您可以应用数组样式表示法:
var valueOfName = localStorage["name"];
localStorage["name"] = "value";
就是这样!并且它的 API 中没有过期日期、URL 字符串或其他复杂情况,这些都发生在旧 cookie 方法中。 AmplifyJs 提供的所有东西(如我所见)是通过为您提供与原始 localStorage 相同的 API 来支持旧浏览器(使用 cookie)。
换句话说,如果您不是针对 Netscape Navigator、Mosaic 和 IE 7,您可以忘记使用 AmplifyJS 并应用本机 localStorage API。
但是,尽管有一种方法,但您绝对不应该依赖客户端持久性,因为它完全依赖于本地浏览器(客户端可以简单地清除缓存、重新安装某些东西或从其他计算机登录)- 使用服务器端用于保存用户信息的数据库和类似技术。
【讨论】:
谢谢。 AmplifyJS Store 还允许您设置 StorageType,例如localStorage、sessionStorage 等。在我的特殊情况下,我只使用 sessionStorage。我已经建立了自己的逻辑以使用sessionStorage
作为默认值,或者如果这不可用,请依靠 AmplifyJS Store 的智慧。我没有存储任何关键的用户数据,只是在网页处于活动状态时插件需要运行的数据。
BTW 本地和会话存储之间的差异(根据规范)是清除它的时间:对于本地它一直存在,直到您使用 localStorage.removeItem(key) 删除项目或删除 localStorage['key' ] 或用新值重写,但每次用户关闭浏览器窗口时都会删除 sessionStorage(这就是我最喜欢 localStorage amon session 的原因 - 您可以重新加载 PC 以进行更新,重新启动浏览器并返回您曾经使用过的地方应用程序)。 IMO最好自己控制擦除时间:例如注销操作后清理你的 localStorage 变量。
是的,我理解其中的区别。我使用 sessionStorage 是因为它是我的应用程序的最佳存储类型(用户会话后不需要持久性),而且它允许我的应用程序以多浏览器选项卡的方式运行而不会出现任何问题【参考方案2】:
如果您实际上是在尝试保存持久性数据(如果页面重新加载或用户导航离开时仍然存在的数据),则不能将其存储在窗口对象中。当您稍后检查时,数据将不存在。
【讨论】:
谢谢。我想我真的认为 AmplifyJS 商店是理所当然的#BigTime 哈哈。也许我正在尝试过度优化。以上是关于使用 window 对象进行会话存储而不是 AmplifyJS 存储的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 javascript 而不是 Django 会话将表单数据(Django 表单)存储到浏览器的本地存储?