LoginSignup
1
1

More than 5 years have passed since last update.

iOS Safari で iframe を配置したページに戻ると初回しか onpageshow が発生しない

Posted at

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 を置かない
  • onpageshowdocument.location.reload() を呼んで再読み込みする

くらいしかわかっていません。

情報お持ちの方はコメントください。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1