Использование LocalStorage на iPhone с iOS 7 выдает эту ошибку. Я искал резольвант, но, учитывая, что я даже не заглядываю в приват, ничего не имеет значения.
Я не понимаю, почему localStorage будет отключен по умолчанию в iOS 7, но кажется, что это так? Я тестировал и на других сайтах, но безуспешно. Я даже пытался протестировать его с помощью этого сайта: http://arty.name/localstorage.html , но не похоже, что он вообще что-то сохраняет по какой-то странной причине.
У кого-нибудь была такая же проблема, только им повезло, исправляя ее? Должен ли я изменить свой метод хранения?
Я попытался отладить его, сохранив только несколько строк информации, но безрезультатно. Я использовал стандартную localStorage.setItem()
функцию для сохранения.
Ответы:
Это может произойти, когда Safari находится в режиме приватного просмотра. Во время приватного просмотра локальное хранилище вообще не доступно.
Одним из решений является предупреждение пользователя о том, что для работы приложения необходим не-приватный режим.
ОБНОВЛЕНИЕ: это было исправлено в Safari 11 , поэтому теперь поведение соответствует другим браузерам.
источник
if( typeof Storage != 'undefined' ) { ... }
), прежде чем пытаться загрузить и сохранить информацию, но получил эту ошибку. Оказывается,Storage
все еще определяется, даже когда это непригодно. Используя try / catch, теперь я использую LocalStorage.Как упоминалось в других ответах, вы всегда будете получать ошибку QuotaExceededError в режиме приватного браузера Safari как на iOS, так и на OS X при вызове
localStorage.setItem
(илиsessionStorage.setItem
).Одним из решений является проверка try / catch или Modernizr в каждом случае использования
setItem
.Однако, если вы хотите, чтобы шим, который просто глобально останавливал эту ошибку, чтобы предотвратить поломку остальной части вашего JavaScript, вы можете использовать это:
https://gist.github.com/philfreo/68ea3cd980d72383c951
источник
Я использую эту простую функцию, которая возвращает
true
илиfalse
, для проверки доступности localStorage:Теперь вы можете проверить
localStorage.setItem()
наличие, прежде чем использовать его. Пример:источник
window.sessionStorage
используется вместоwindow.localStorage
вызываемого методаisLocalStorageNameSupported
?HTML local storage provides two objects for storing data on the client: window.localStorage - stores data with no expiration date window.sessionStorage - stores data for one session (data is lost when the browser tab is closed)
sessionStorage
делает его более управляемым для установки точек останова, если вы хотите проверить свою разработку. Не существует истинного аргумента в пользу того, что «лучше», и это просто личное предпочтение, которое ошибается из-за осторожности. Главное, на что следует обратить внимание, это то, что обеsessionStorage
иlocalStorage
обе являются реализацией API веб-хранилища HTML5.Я столкнулся с той же проблемой в iOS 7 (на некоторых устройствах нет симуляторов).
Похоже, Safari в iOS 7 имеет более низкую квоту хранилища, что, очевидно, достигается за счет длинного журнала истории.
Я думаю, что лучшая практика будет ловить исключение.
Проект Modernizr имеет простой патч, вы должны попробовать что-то похожее: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js
источник
Вот расширенное решение, основанное на ответе DrewT выше, которое использует куки, если localStorage недоступен. Он использует библиотеку Mozilla docCookies :
В вашем источнике просто используйте:
источник
Как уже объяснялось в других ответах, в режиме приватного просмотра Safari всегда выдает это исключение при попытке сохранить данные с помощью
localStorage.setItem()
.Чтобы исправить это, я написал поддельное localStorage, которое имитирует localStorage, как методы, так и события.
Поддельный localStorage: https://gist.github.com/engelfrost/fd707819658f72b42f55
Вероятно, это не очень хорошее общее решение проблемы. Это было хорошим решением для моего сценария, где альтернативой было бы серьезное переписывание уже существующего приложения.
источник
Обновление (2016-11-01)
Я использовал AmplifyJS, упомянутый ниже, чтобы обойти эту проблему. Тем не менее, для Safari в режиме приватного просмотра он возвращался к памяти на основе памяти. В моем случае это было неуместно, потому что это означает, что хранилище очищается при обновлении, даже если пользователь все еще находится в режиме частного просмотра.
Кроме того, я заметил ряд пользователей, которые всегда смотрят в приватном режиме на iOS Safari. По этой причине лучшим вариантом для Safari является использование файлов cookie (если они доступны). По умолчанию файлы cookie по-прежнему доступны даже при приватном просмотре. Конечно, они очищаются при выходе из частного просмотра, но они не очищаются при обновлении.
Я нашел библиотеку local-storage-fallback . Из документации:
Остерегайтесь ошибок:
TL; DR:
Используйте local-storage-fallback (унифицированный API с
.getItem(prop)
и.setItem(prop, val)
):Оригинальный ответ
Чтобы добавить к предыдущим ответам, одним из возможных обходных путей может быть изменение метода хранения. Есть несколько библиотек, таких как AmplifyJS и PersistJS, которые могут помочь. Обе библиотеки обеспечивают постоянное хранение на стороне клиента через несколько бэкэндов.
Для AmplifyJS
Для постоянных JS
Они предлагают уровень абстракции, поэтому вам не нужно беспокоиться о выборе типа хранилища. Имейте в виду, что могут быть некоторые ограничения (например, ограничения размера) в зависимости от типа хранилища. Прямо сейчас я использую AmplifyJS, но мне все еще нужно провести еще какое-то тестирование на iOS 7 / Safari / и т.д. чтобы увидеть, действительно ли это решает проблему.
источник
В апреле 2017 года патч был объединен с Safari, поэтому он соответствовал другим браузерам. Это было выпущено с Safari 11.
https://bugs.webkit.org/show_bug.cgi?id=157010
источник
Этот вопрос и ответ помогли мне решить конкретную проблему с регистрацией новых пользователей в Parse.
Поскольку функция signUp (attrs, options) использует локальное хранилище для сохранения сеанса, если пользователь находится в режиме частного просмотра, он выдает «QuotaExceededError: Исключение DOM 22: была предпринята попытка добавить в хранилище что-то, превышающее квоту». Функции исключения и успеха / ошибки никогда не вызываются.
В моем случае, так как функция ошибки никогда не вызывается, изначально возникла проблема с активацией события click для подтверждения или перенаправления, определенного при успешной регистрации.
Включение предупреждения для пользователей решило проблему.
Разбор ссылки на Javascript SDK https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp
источник