nearproの日記

特に意味はありません。主に読んだ本をただただ記録します。

iPhoneのSafariのプライベートモードでlocalStorageが動かない

最近、スマホ向けサイトでお気に入りに登録してねとか、初回だけアラート出すような奴、結構流行ってるじゃないですか。

jsでサクッと書く場合、localStorageにタイムスタンプをsetしたり、あるいは見たよ的な値をsetすると思うんです。

そんでアラート消すとかするじゃないですか。

node.addEventListener("click",function(e){
  localStorage.setItem('mitayo',1);
  node.parentNode.removeChild(node);
});

それは良いんですが、その後、忘れた頃に他の修正をはじめちゃって、それで、ブラウザキャッシュうざいからプライベートモードでゴリゴリ確認しようとか思い立つんです。

そしたらアラートうざいんですよね。だから、「消そう」と。

そしたら消えないんですよ。

知らない間にバグ増えてるとか焦りますよね。iOSのバージョンアップとかのせいにして必死でデバッグするんです。 でも、プライベートじゃないSafariだと既にアラート消してたりするんで、プライベートモードで開いてアラート出すんです。

でも、消えないんですよ。

一生懸命、イベントタイプとかz-indexとか色々いじるんですけど、消えないんですよ。

PCのChromeのシークレットモードでシミュレーションしたら、消えるんです。おかしい、なんでだよって思うんです。

一時間くらい悶々としていたら、iPhoneSafariのプライベートモードでlocalStorage触ると例外発生するらしいんですよ。

なので、

node.addEventListener("click",function(e){
  node.parentNode.removeChild(node);
  localStorage.setItem('mitayo',1);
});

と順番入れ替えるか、きちんとcatchしてあげると良いのです。

node.addEventListener("click",function(e){
try{
  node.parentNode.removeChild(node);
} catch(e){}
  localStorage.setItem('mitayo',1);
});

何もない穴に地雷を埋めて、再び掘り返すような人が二度と現れませんように…。

参考

【JS】SafariのプライベートモードではlocalStorageが動かない | kotazi.com