【问题标题】:Solution for Firefox user disabling cookies and thus localStorage - polyfill not possibleFirefox 用户禁用 cookie 并因此禁用 localStorage 的解决方案 - 无法使用 polyfill
【发布时间】: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


【解决方案1】:

由于localStorage 是一个保留变量,除了使用具有不同名称的包装器之外,您没有其他明智的选择。将您自己的代码和真正的 localStorage 包装在此变量下,并将 localStorage 替换为您的包装器的名称。烦人,但比丢失更改更烦人。

【讨论】:

    【解决方案2】:

    你有两个选择:

    1) 利用词法作用域以及查找的工作原理...例如,如果您的代码在闭包中运行,那么您可以在该闭包中运行以下命令:

    var localStorage = window.localStorage || {... polyfill here...};
    

    然后在您的代码中使用 localStorage 而不是完全限定的 window.localStorage。这里的优势只是词法变量查找的工作方式,它将找到您更“紧密”的范围版本而不是全局版本。 PS...无论如何,您可能应该在闭包中运行,所以这应该是可能的。

    2) 只是变量重命名,类似于人们删除供应商前缀的相反操作。

    window.pLocalStorage = window.localStorage || {... polyfill here...};
    

    然后只需将您的代码更改为使用 pLocalStorage 而不是 localStorage...如果他们的浏览器支持它,那么它将使用本机,否则使用 polyfill。

    【讨论】:

    • 尼克,重申我在原始问题中写的问题:“你甚至不能为它创建一个 polyfill,因为每当你尝试访问 window.localStorage 时,你都会得到错误:操作不安全。 "如果您禁用 cookie,您甚至无法在不引发 JS 错误的情况下引用此变量。
    • Mauvis... 无法在 Mac 版本上以文本形式出现该错误。也就是说,第二个选项可以与一些 mod 配合使用,以便与您在问题中遇到的 try catch 很好地配合... try{ window.pLocalStorage = window.localStorage; }catch(err){ window.pLocalStorage = { getItem: function(k){ return this.k; }, setItem: function(k,v){ this.k = v; } }; }
    【解决方案3】:

    我们将其用作本地存储的库。

    (function (window, $, undefined) {
        var store = window.store = {};
    
        function deserialize(val) {
            if (!val) return null;
            var obj = $.parseJSON(val);
            return obj;
        };
    
        function processRequest(loc, key, value) {
            var obj;
            // if value is not specified at all assume we are doing a get.
            if (value === undefined) {
                // GET
                obj = loc.getItem(key);
                return deserialize(value);
            } else {
                // SET
                loc.setItem(key, JSON.stringify(value));
            }
        }
    
        store.Local = function(key, value) {
            return processRequest(window.localStorage, key, value);
        };
    
        store.Session = function(key, value) {
            return processRequest(window.sessionStorage, key, value);
        };
    } (window, jQuery));
    

    您可以轻松添加一些测试代码以回退到非持久数组。

    【讨论】:

    • 这个解决方案的问题是你必须用它来设置你的“localStorage”东西,而不是真正的localStorage
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2014-04-20
    • 2016-04-08
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多