Есть ли способ увеличить размер localStorage в Google Chrome, чтобы избежать QUOTA_EXCEEDED_ERR: исключение DOM 22
Я написал webapp, который позволяет хранить изображения в localStorage, пока вы не нажмете save (поэтому он работает в автономном режиме, если сигнал плохой).
Когда localStorage достигает 5 МБ Google Chrome создает ошибку в журнале консоли javascript:
Неисправность: QUOTA_EXCEEDED_ERR: исключение DOM 22
Как увеличить размер квоты localStorage в Google Chrome?
Ответы
Ответ 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/