【发布时间】:2013-10-15 02:31:02
【问题描述】:
在我们的一位用户提出投诉并运行一些测试后,似乎 Firefox 15 和 16(可能还有旧版本)可以做到这一点,因此如果您禁用 cookie,您也会禁用 localStorage。你甚至不能为它创建一个 polyfill,因为每当你尝试访问 window.localStorage 时,你会得到 Error: The operation is insecure.
抛出 try catch 可以让您检查它是否被禁用,但不会让您用自己的解决方案替换变量。以下快速填充将不起作用,因为 FF 忽略设置变量并在尝试访问它时会抛出相同的错误:
try{
window.localStorage;
}catch(err){
window.localStorage = {
getItem: function(k){
return this.k;
},
setItem: function(k,v){
this.k = v;
}
};
}
唯一的解决方案似乎是将“假”localStorage 移动到另一个变量,但这会很烦人,因为我们有很多代码和一个依赖于访问这个变量的 js 库。有什么解决办法吗?
编辑: 仅弹出警报告诉用户需要 Cookie 并不是最佳选择。如果访问者只想查看网站而不是注册,那么他们真的不需要 cookie。但是作为一个骨干网应用程序并传递大量数据,我们确实在 localStorage 中存储了很多东西。
【问题讨论】:
-
如果您可以检查它是否被禁用,只需弹出警报或告诉他们需要为您的网站启用 cookie。
-
感谢 MrObrian,我做到了,并且正在向 div 中注入消息,但对于 localStorage 来说,它只是作为不持久的键/值存储工作的最佳选择,因为这是用户想要的.
-
"但是对于 localStorage 来说,作为一个不持久的键/值存储是最佳选择"为什么不在这种情况下只使用一个简单的 js 数组?
-
@S.C. polyfill 数据类型不是问题。我可以使用我写的上面的代码作为数据存储我只是不能使用变量 window.localStorage 这意味着我必须重写我的平台的一部分和一个 js localStorage 库只是为了解决这种情况,以便用户可以真正在不启用 cookie 的情况下使用我的平台。
-
最好的办法可能是打破对本地存储的依赖。我说这是因为一些网站不支持它。我建议重构您的应用程序。我不会将它分配给数组,而是尽我所能使所有内容都指向一个处理数据持久性和数据检索的函数。这样,程序的其余部分就不必关心数据的存储方式/存储位置。
标签: javascript firefox local-storage