Подтвердить что ты не робот

Есть ли способ увеличить размер localStorage в Google Chrome, чтобы избежать QUOTA_EXCEEDED_ERR: исключение DOM 22

Я написал webapp, который позволяет хранить изображения в localStorage, пока вы не нажмете save (поэтому он работает в автономном режиме, если сигнал плохой).

Когда localStorage достигает 5 МБ Google Chrome создает ошибку в журнале консоли javascript:

Неисправность: QUOTA_EXCEEDED_ERR: исключение DOM 22

Как увеличить размер квоты localStorage в Google Chrome?

4b9b3361

Ответ 1

Вы не можете, это жестко подключено к 5 МБ. Это дизайнерское решение разработчиков Chrome.

В Chrome, как и в случае с брандмауэром веб-SQL и кэшем, по умолчанию установлены небольшие ограничения, но если вы упакуете приложение для Chrome App Store вы можете увеличить их.

См. также Управление автономным хранилищем HTML5 - Google Chrome.

Ответ 2

Квота предназначена для пользователя, сколько места он хочет разрешить для каждого веб-сайта.

Поэтому, поскольку целью является ограничение веб-страниц, веб-страницы не могут изменить ограничение.

Если хранилище низкое, вы можете предложить пользователю увеличить локальное хранилище.

Чтобы узнать, недостаточно ли хранилище, вы можете определить размер локального хранилища, сохранив объект, а затем удалив его.

Ответ 3

5MB - это жесткий предел, и это глупо. IndexedDB дает вам ~ 50 МБ, что является более разумным. Чтобы упростить использование, попробуйте Dexie.js https://github.com/dfahlander/Dexie.js

Обновление

Dexie.js на самом деле все еще был излишним для моих простых целей с ключевыми значениями, поэтому я написал намного проще script https://github.com/DVLP/localStorageDB

с этим вы имеете 50 МБ и можете получать и устанавливать такие значения

// Setting values
ldb.set('nameGoesHere', 'value goes here');

// Getting values - callback is required because the data is being retrieved asynchronously:
ldb.get('nameGoesHere', function (value) {
  console.log('And the value is', value);
});

Скопируйте/вставьте строку ниже, чтобы ldb.set() и ldb.get() из приведенного выше примера стали доступны.

!function(){function e(t,o){return n?void(n.transaction("s").objectStore("s").get(t).onsuccess=function(e){var t=e.target.result&&e.target.result.v||null;o(t)}):void setTimeout(function(){e(t,o)},100)}var t=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;if(!t)return void console.error("indexDB not supported");var n,o={k:"",v:""},r=t.open("d2",1);r.onsuccess=function(e){n=this.result},r.onerror=function(e){console.error("indexedDB request error"),console.log(e)},r.onupgradeneeded=function(e){n=null;var t=e.target.result.createObjectStore("s",{keyPath:"k"});t.transaction.oncomplete=function(e){n=e.target.db}},window.ldb={get:e,set:function(e,t){o.k=e,o.v=t,n.transaction("s","readwrite").objectStore("s").put(o)}}}();

Ответ 4

Вы не можете, но если вы сохраните JSON в своем локальном хранилище, вы можете использовать библиотеку для сжатия данных, например: https://github.com/k-yak/JJLC

demo: http://k-yak.github.io/JJLC/