Firefox用户禁用cookie的解决方案,因此localStorage - polyfill无法实现

Mau*_*ord 9 javascript firefox local-storage

在我们的一个用户投诉并运行一些测试之后,Firefox 15和16(以及可能是旧版本)出现了这样的情况,如果您禁用cookie,您也会禁用localStorage.你甚至不能为它创建一个填充工具作为每当您尝试访问window.localStorageError: 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;
              }
        };
}
Run Code Online (Sandbox Code Playgroud)

唯一的解决方案似乎是将"假"localStorage移动到另一个变量,但这会很烦人,因为我们有很多代码和一个依赖于访问这个变量的js lib.有解决方案吗

编辑:仅弹出警报以告知用户需要cookie是不理想的.如果访问者只想查看网站而不注册,那么他们真的不需要cookie.但作为backbone.js应用程序并传递大量数据,我们确实在localStorage中存储了很多东西.

DeM*_*teD 0

我们使用它作为本地存储的库。

(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));
Run Code Online (Sandbox Code Playgroud)

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