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');
}
また
if (localStorage === undefined) {... }
ただし、iOS 8.3 以降では、ユーザーが Cookie を無効にすると、このコードは未処理の JavaScript エラーをスローします。また、ユーザーがプライベート ブラウジング モードに入ると、localStorage に書き込もうとすると同じエラー メッセージが表示されます。
SecurityError: DOM Exception 18: ユーザー エージェントのセキュリティ ポリシーを突破しようとしました。
回避策
iOS のこの特定の動作による望ましくない JavaScript エラーを回避するための 1 つの提案は、それを 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 がサポートされていないシナリオの場合、考えられる代替手段には、サーバー セッション (Cookie がサポートされていない場合は URL パラメーターに基づく)、またはシリアル化されたデータを格納するための window.name 変数が含まれます。
または、Single Page App として設計および構築する場合は、グローバル名前空間にデータを保存する必要がまったくない可能性があります。