10

在我们的一位用户提出投诉并运行了一些测试后,似乎 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。但是作为一个backbone.js 应用程序并传递大量数据,我们确实在localStorage 中存储了很多东西。

4

3 回答 3

1

你有两个选择:

1)利用词法范围和查找如何工作......例如,如果您的代码在闭包中运行,那么在该闭包内您可以运行以下内容:

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

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

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

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

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

于 2013-08-08T15:53:39.520 回答
1

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

于 2013-06-22T18:40:50.213 回答
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));

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

于 2012-10-11T11:32:01.260 回答