ラボ > Javascript関連:イベント関連

js ブラウザバックの対応

ブラウザで「戻る」ボタンを押したときの対応

作成日:2021-10-23, 更新日:2021-10-27

経緯

1.適当なページを開く(メニューは閉じられている)
2.閉じられているメニューを開く
3.違うページに遷移
4.ブラウザバック(ブラウザで「戻る」ボタンを押したとき)で戻る
5.「2」の状態になる。希望は「1」のメニューが閉じられた状態

対策

以下、メモ。
・chromeはセキュリティ対策で「popstate」はすでに使えない(2021-10-23時点)
・iPhoneサファリは「bfcache(Back Forward Cache)」が有効
・「bfcache(Back Forward Cache)」が有効な場合、キャッシュを表示。有効でないならキャッシュではなくページを読み込む・・・らしい
・端末かブラウザの何が原因なのかは不明だけど・・・取得できない何かがある

→ひとまず問題は無いっぽい(2021-10-27時点)

サンプル

▼2021-10-23時点の暫定処理

noHave_bfcache = function() {
  let perfEntries = performance.getEntriesByType('navigation');
  if ( perfEntries.length == 0 ) {
    // perfEntriesが空っぽ: ブラウザバックではない・・・と思う。取得できない端末(or ブラウザ)がある。
  }
  else {
    perfEntries.forEach(function(flg){ // 複数個取得されることがあるのかは不明・・・状況によって中のif文でbreak的な何かをいれた方がいいかも?
      if (flg.type == 'back_forward'){
        // ブラウザバックの時
      }
      else {
        // ブラウザバックではない時
      }
    });
  }
}

window.onpageshow = function(event) { // キャッシュが残った状態でページが表示された時に発生: キャッシュは関係あるのか・・・微妙
  if (event.persisted) {
    // 「bfcache(Back Forward Cache)」を検出→ブラウザバック・・・iPhoneサファリだけかも?
    window.location.reload(); // 基本、リロード。リロードがイヤなら任意の処理
  }
  else {
    // 「bfcache(Back Forward Cache)」を検出していないので、さらに深掘りする
    noHave_bfcache();
  }
};

関連項目

js 「ブラウザバックで戻ってきた」ときの制御(performance.getEntriesByType())