iOS Safari などのブラウザで戻るボタンやスワイプなどの操作を使ってページを戻った場合、表示にはキャッシュが使用されます。
参考:戻るボタンが押された際、ページのJavaScriptを途中の状態から実行させない方法 » nmi.jp
このとき、例えば2重押下防止のためにボタンを disabled
にしてたり画面全体に div
を広げてたりした場合、その状態まで復元されてしまい困ります。そんなときには onpageshow
というイベントを使用することでページの表示を検知して元の状態に戻すのが定石です。
ところが、ページ遷移 ⇒ 戻る(A) ⇒ ページ遷移 ⇒ 戻る(B) と操作したときに (A) では onpageshow
が発生するのに (B) では発生しない、という現象に遭遇しました。
以下が再現できるミニマムコードです。iOS 8.2 (Apple Watch 発表直後の最新バージョン)で確認しています。
a.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<a href="b.html">aaaaaaaa</a>
<script>
window.onpageshow = function() {
alert('onpageshow');
};
</script>
<iframe></iframe>
</body>
</html>
b.html の中身は何でもいいです。
条件は iframe
要素が置かれていること。
これによって 2 回目の戻る以降では onpageshow
が呼ばれなくなります。
解決方法は……
-
iframe
を置かない -
onpageshow
でdocument.location.reload()
を呼んで再読み込みする
くらいしかわかっていません。
情報お持ちの方はコメントください。