2

localStorage.setItemモバイル iOS 8.3 では動作しません。

誰もこの問題を経験していますか?
コードは次のとおりです。

var storage = window.localStorage;
storage.setItem('test',45);
alert(storage.getItem('test'));
4

2 に答える 2

5

以前は、次のようなものを使用できました。

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 として設計および構築する場合は、グローバル名前空間にデータを保存する必要がまったくない可能性があります。

于 2016-09-20T01:30:05.027 に答える