10

ユーザーの 1 人から苦情があり、いくつかのテストを実行した結果、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;
              }
        };
}

唯一の解決策は、「偽の」localStorageを別の変数に移動することのようですが、この変数へのアクセスに依存する多くのコードとjs libがあるため、これは面倒です。解決策はありますか?

編集: Cookie が必要であることをユーザーに知らせるアラートをポップアップ表示するだけでは最適ではありません。訪問者がサインアップせずにサイトを表示するだけの場合、Cookie は本当に必要ありません。しかし、backbone.js アプリケーションであり、大量のデータをやり取りするため、localStorage にかなりの量を格納します。

4

3 に答える 3

1

は予約変数であるためlocalStorage、別の名前のラッパーを使用する以外に適切なオプションはありません。この変数の下に独自のコードと実際の localStorage をラップlocalStorageし、ラッパーの名前に置き換えます。面倒ですが、変更を失うことよりも面倒ではありません。

于 2013-06-22T18:40:50.213 に答える
1

次の 2 つのオプションがあります。

1) レキシカル スコープとルックアップの仕組みを利用します。たとえば、コードがクロージャで実行されている場合、そのクロージャ内で次を実行できます。

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

次に、コード内で完全修飾 window.localStorage の代わりに localStorage を使用します。ここでの利点は、レキシカル変数ルックアップが機能する方法であり、グローバルではなく、より「厳密に」スコープされたバージョンを見つけます。PS ...とにかくクロージャーで実行しているはずなので、これは可能です。

2) 変数の名前を変更するだけで、ベンダー プレフィックスを削除するために人々が行うことの逆に似ています。

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

次に、localStorage の代わりに pLocalStorage を使用するようにコードを変更するだけです...ブラウザがサポートしている場合はネイティブを使用し、そうでない場合はポリフィルを使用します。

于 2013-08-08T15:53:39.520 に答える
0

これをローカル ストレージの lib として使用します。

(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 に答える