localStorage.setItem
не работает на мобильной версии iOS 8.3.
Кто-нибудь сталкивался с этой проблемой?
Вот код:
var storage = window.localStorage;
storage.setItem('test',45);
alert(storage.getItem('test'));
localStorage.setItem
не работает на мобильной версии iOS 8.3.
Кто-нибудь сталкивался с этой проблемой?
Вот код:
var storage = window.localStorage;
storage.setItem('test',45);
alert(storage.getItem('test'));
Раньше мы могли использовать что-то вроде:
if ('localStorage' in window && window.localStorage !== null) {
alert('can use');
}else{
alert('cannot use');
}
or
if (localStorage === undefined) {... }
Однако в iOS 8.3+, когда пользователь отключает файлы cookie, этот код выдает необработанную ошибку JavaScript. А когда пользователь переходит в режим приватного просмотра, такое же сообщение об ошибке появляется при попытке записи в localStorage.
SecurityError: DOM Exception 18: была предпринята попытка нарушить политику безопасности пользовательского агента.
Временное решение
Чтобы избежать нежелательных ошибок JavaScript из-за этого конкретного поведения iOS, одно из предложений состоит в том, чтобы заключить его в блоки try catch. (по крайней мере пока)
try{
if ('localStorage' in window && window.localStorage !== null) {
localStorage.setItem('testLocalStorage', 'testLocalStorage');
if (localStorage.getItem('testLocalStorage') !== 'testLocalStorage') {
localStorage.removeItem('testLocalStorage');
//for private browsing, error is thrown before even getting here
alert('can read CANNOT write');
}else{
localStorage.removeItem('testLocalStorage');
alert('can use');
}
}else{
alert('CANNOT use');
}
}catch(ex){
alert('CANNOT use reliably');
}
Примечание. Это не предложение использовать оповещения в ваших реальных кодах. Это просто для быстрой иллюстрации.
Возможная краткая форма
try {
localStorage.setItem('testLocalStorage', 'testLocalStorage');
localStorage.removeItem('testLocalStorage');
alert('supported');
} catch(ex) {
alert('unsupported');
}
Что мы можем использовать вместо этого
Для сценариев, в которых localStorage не поддерживается, возможные альтернативы включают сеансы сервера (на основе параметров URL-адреса, если файлы cookie не поддерживаются) или переменную window.name для хранения сериализованных данных.
Или, если вы проектируете и создаете одностраничное приложение, возможно, вам вообще не нужно хранить данные в глобальном пространстве имен.
Вы должны проверить, доступен ли localStorage с помощью кода, подобного if ('localStorage' in window && window.localStorage !== null) { ...
, прежде чем использовать его.