641

(現在) 文字列のみを値としてサポートしているためlocalStorage、オブジェクトを格納する前に文字列化 (JSON 文字列として格納) する必要があるため、値の長さに関して定義された制限があります。

すべてのブラウザに適用される定義があるかどうかは誰にもわかりませんか?

4

12 に答える 12

475

Web Storage に関するウィキペディアの記事からの引用:

Web ストレージは単純に Cookie の改善と見なすことができ、はるかに大きなストレージ容量を提供します (Google Chrome ( https://plus.google.com/u/0/+FrancoisBeaufort/posts/S5Q9HqDB8bh )、Mozilla Firefox ではオリジンあたり 10 MB)。 、および Opera (Internet Explorer ではストレージ領域あたり 10 MB ) と、より優れたプログラム インターフェイスです。

また、John Resig の記事[2007 年 1 月投稿] からの引用:

収納スペース

DOM Storage を使用すると、Cookie に課せられる典型的なユーザー エージェントの制限よりもかなり多くのストレージ スペースがあることが暗示されます。ただし、提供される量は仕様で定義されておらず、ユーザーエージェントによって意味のあるブロードキャストもされていません。

Mozilla ソース コードを見ると、5120KB がドメイン全体のデフォルトのストレージ サイズであることがわかります。これにより、通常の 2KB の Cookie よりもかなり多くの作業スペースが得られます。

ただし、このストレージ領域のサイズは、ユーザー(したがって、5MB のストレージ領域は保証されておらず、暗示されているわけでもありません) とユーザーエージェント (たとえば、Opera は 3MB しか提供しない場合がありますが、時間が経てばわかります) によってカスタマイズできます。 )

于 2010-06-07T12:12:55.480 に答える
145

実際、Opera には 5MB の制限はありません。アプリケーションがより多くを必要とするため、制限を増やすことを提案します。ユーザーは、ドメインに対して「無制限のストレージ」を選択することもできます。

localStorage の制限/クォータを自分で簡単にテストできます。

于 2010-07-15T21:24:43.077 に答える
94

制限を見つけるための簡単なスクリプトを次に示します。

if (localStorage && !localStorage.getItem('size')) {
    var i = 0;
    try {
        // Test up to 10 MB
        for (i = 250; i <= 10000; i += 250) {
            localStorage.setItem('test', new Array((i * 1024) + 1).join('a'));
        }
    } catch (e) {
        localStorage.removeItem('test');
        localStorage.setItem('size', i - 250);            
    }
}

Gist、JSFiddle 、およびブログ投稿は次のとおりです。

スクリプトは、ブラウザが例外をスローするまで、徐々に大きくなるテキスト文字列の設定をテストします。その時点で、テスト データを消去し、サイズをキロバイト単位で格納する localStorage にサイズ キーを設定します。

于 2014-09-12T16:12:43.790 に答える
19

大きなオブジェクトを単一の localStorage エントリに文字列化する必要はありません。これは非常に非効率的です。細かい部分が少し変更されるたびに、全体を解析して再エンコードする必要があります。また、JSON はオブジェクト構造内の複数の相互参照を処理できず、多くの詳細 (コンストラクタ、配列の非数値プロパティ、スパース エントリの内容など) を消去します。

代わりに、Rhabooを使用できます。多数の localStorage エントリを使用して大きなオブジェクトを格納するため、小さな変更をすばやく行うことができます。復元されたオブジェクトは、保存されたオブジェクトのより正確なコピーであり、API は非常にシンプルです。例えば:

var store = Rhaboo.persistent('Some name');
store.write('count', store.count ? store.count+1 : 1);
store.write('somethingfancy', {
  one: ['man', 'went'],
  2: 'mow',
  went: [  2, { mow: ['a', 'meadow' ] }, {}  ]
});
store.somethingfancy.went[1].mow.write(1, 'lawn');

ところで、私はそれを書きました。

于 2014-10-01T11:32:00.217 に答える
6

私は次のことをしています:

getLocalStorageSizeLimit = function () {

    var maxLength = Math.pow(2,24);
    var preLength = 0;
    var hugeString = "0";
    var testString;
    var keyName = "testingLengthKey";

    //2^24 = 16777216 should be enough to all browsers
    testString = (new Array(Math.pow(2, 24))).join("X");

    while (maxLength !== preLength) {
        try  {
            localStorage.setItem(keyName, testString);

            preLength = testString.length;
            maxLength = Math.ceil(preLength + ((hugeString.length - preLength) / 2));

            testString = hugeString.substr(0, maxLength);
        } catch (e) {
            hugeString = testString;

            maxLength = Math.floor(testString.length - (testString.length - preLength) / 2);
            testString = hugeString.substr(0, maxLength);
        }
    }

    localStorage.removeItem(keyName);

    maxLength = JSON.stringify(this.storageObject).length + maxLength + keyName.length - 2;

    return maxLength;
};
于 2014-06-16T21:28:27.120 に答える
4

このため、Chrome (デスクトップ ブラウザ) 拡張機能を開発し、ローカル ストレージの実際の最大サイズをテストしたことがあります。

私の結果:

Ubuntu 18.04.1 LTS (64-bit)
Chrome 71.0.3578.98 (Official Build) (64-bit)
Local Storage content size 10240 KB (10 MB)

使用量を超える10240 KBと、エラーが返されました:

キャッチされない DOMException: 'Storage' で 'setItem' を実行できませんでした: 'notes' の値の設定がクォータを超えました。

2020年10月23日編集

Chrome 拡張機能で利用可能なchrome.storageAPI の場合。で「ストレージ」パーミッションを宣言した場合manifest.js:

{
    "name": "My extension",
    ...
    "permissions": ["storage"],
    ...
}

次のようにアクセスできます。

chrome.storage.local.QUOTA_BYTES // 5242880 (in bytes)
于 2019-04-18T16:23:04.783 に答える