В моем веб-приложении есть ошибки javascript в приватном просмотре ios safari:
JavaScript: ошибка
не определено
QUOTA_EXCEEDED_ERR: DOM Exception 22: была сделана попытка добавить что-то в хранилище ...
мой код:
localStorage.setItem('test',1)
javascript
html
local-storage
leiyonglin
источник
источник
Ответы:
Видимо это по замыслу. Когда Safari (OS X или iOS) находится в режиме частного просмотра, он выглядит как
localStorage
доступный, но попытка вызоваsetItem
вызывает исключение.То, что происходит, - то, что объект окна все еще выставляется
localStorage
в глобальном пространстве имен, но когда вы вызываетеsetItem
, это исключение выдается. Любые звонкиremoveItem
игнорируются.Я считаю, что самое простое исправление (хотя я еще не тестировал этот кросс-браузер) - изменить функцию,
isLocalStorageNameSupported()
чтобы проверить, что вы также можете установить какое-то значение.https://github.com/marcuswestin/store.js/issues/42
источник
return localStorageName in win && win[localStorageName];
наreturn true
. Тогда у вас есть функция, которая безопасно возвращает истину или ложь в зависимости от доступности localStorage. Например:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
Исправление, размещенное по вышеуказанной ссылке, не работает для меня. Это сделал:
Получено из http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5
источник
window.sessionStorage
это правильно. Это конечно работает в моем коде. Пожалуйста , на самом деле указывают на исправление этой проблемы вы оказываетесь знать.isLocalStorageNameSupported
и проверялwindow.sessionStorage
. Тот же конечный результат, но был немного запутанным. Ответ был отредактирован для уточнения.Как упоминалось в других ответах, вы всегда получите QuotaExceededError в режиме приватного браузера Safari на iOS и OS X при вызове
localStorage.setItem
(илиsessionStorage.setItem
).Одним из решений является проверка try / catch или Modernizr в каждом случае использования
setItem
.Однако, если вы хотите, чтобы шим, который просто глобально останавливал эту ошибку, чтобы предотвратить поломку остальной части вашего JavaScript, вы можете использовать это:
https://gist.github.com/philfreo/68ea3cd980d72383c951
источник
В моем контексте только что разработали абстракцию класса. Когда мое приложение запускается, я проверяю, работает ли localStorage, вызывая getStorage () . Эта функция также возвращает:
В моем коде я никогда не вызываю localStorage напрямую. Я вызываю глобальную переменную cusSto , которую я инициализировал, вызвав getStorage () .
Таким образом, он работает с приватным просмотром или определенными версиями Safari.
источник
Кажется, что Safari 11 меняет поведение, и теперь локальное хранилище работает в частном окне браузера. Ура!
Наше веб-приложение, которое раньше не работало в режиме приватного просмотра Safari, теперь работает безупречно. Он всегда хорошо работал в режиме частного просмотра Chrome, который всегда позволял записывать в локальное хранилище.
Это задокументировано в заметках о выпуске Apple Safari Technology Preview - и в заметках о выпуске WebKit - для выпуска 29, выпущенного в мае 2017 года.
В частности:
источник
Чтобы расширить ответы других, вот компактное решение, которое не раскрывает / добавляет новые переменные. Он не охватывает все основы, но должен подходить большинству людей, которые хотят, чтобы одностраничное приложение оставалось работоспособным (несмотря на отсутствие сохранения данных после перезагрузки).
источник
У меня была такая же проблема с использованием Ionic Framework (Angular + Cordova). Я знаю, что это не решает проблему, но это код для Angular Apps, основанный на ответах выше. У вас будет временное решение для localStorage в iOS-версии Safari.
Вот код:
Источник: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871
Приятного кодирования!
источник
Вот решение для AngularJS, использующее IIFE и использующее тот факт, что сервисы являются одиночными .
Это приводит к тому,
isLocalStorageAvailable
что он устанавливается сразу же после первого запуска службы и позволяет избежать ненужного запуска проверки каждый раз, когда требуется доступ к локальному хранилищу.источник
Я только что создал этот репозиторий, чтобы предоставить
sessionStorage
иlocalStorage
функции для неподдерживаемых или отключенных браузеров.Поддерживаемые браузеры
Как это устроено
Он обнаруживает функцию с типом хранилища.
Наборы
StorageService.localStorage
для ,window.localStorage
если она поддерживается или создает хранилище печенья. НаборыStorageService.sessionStorage
для ,window.sessionStorage
если она поддерживается или создает в памяти хранения для SPA, хранения печенья с особенностями Sesion для отсутствия SPA.источник
Вот сервисная версия Angular2 + для альтернативы памяти, которую вы можете просто вставить в свои компоненты, основываясь на ответе Пьера Ле Ру.
источник
Не используйте его, если он не поддерживается, а для проверки поддержки просто вызовите эту функцию
источник
Я создал патч для этой проблемы. Просто я проверяю, поддерживает ли браузер localStorage или sessionStorage или нет. Если нет, то механизм хранения будет Cookie. Но отрицательная сторона - у Cookie очень крошечная память :(
источник
Принятый ответ кажется неадекватным в нескольких ситуациях.
Чтобы проверить, поддерживаются ли
localStorage
илиsessionStorage
я, я использую следующий фрагмент из MDN .Используйте этот фрагмент, как этот, и используйте, например, cookie:
Я сделал пакет fallbackstorage , который использует этот фрагмент для проверки доступности хранилища и возврата к реализованному вручную MemoryStorage.
источник
источник
Следующий скрипт решил мою проблему:
Он проверяет, существует ли localStorage и может ли он использоваться, а в отрицательном случае создает поддельное локальное хранилище и использует его вместо исходного localStorage. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
источник