どうもイハラです。

Javascriptで通常ページ読み込み後に使用するイベントはonloadイベントを使用します。
ですが、ブラウザの戻るボタンを押して前のページに戻った場合はonloadイベントは発火しません。

ブラウザバックではonloadイベントは動きません。

ブラウザバックを検知するのによく使われているpageshow

そこで登場するのがpageshowイベントです。

pageshow イベントは、セッション履歴のエントリのトラバース時に発生します(これは、戻る/進むも、onloadイベント後の初期のページ表示も含みます)。

https://developer.mozilla.org/ja/docs/Web/Events/pageshow

pageshowイベント発火時に2重送信防止を解除されるようにすれば、ブラウザバックしても問題なく再送信することができる…はずが、Safariだけ罠があります。

1回目のブラウザバックにしかpageshowイベントは発火しない

ChromeやIEなどは特に問題ないのですが、実はSafariだけ以下のような問題があります。

  1. 遷移
  2. ブラウザバック(pageshowイベント発火)
  3. 遷移
  4. ブラウザバック(pageshowイベント発火しない)

Safariだけ2回目以降のブラウザバック時にpageshowイベントが反応しないのです。

ブラウザバックを検知する別の方法

こんなバグがあるとブラウザバックの検知にpageshowが使えない。。

実際このバグを知ってからはpageshowイベントは使わなくなりました。

実はブラウザバックを検知する方法は他にもあります。

今までpageshowイベントで実装してしまっていたものは、すべてこの方法に差し替えました。

一応テストはしていたのですが、複数回ブラウザバックしてチェックしていなかったので、このバグに気づけなかった。。

同じようにpageshowイベントが動かなくて困っている方!たぶんこれが問題だと思います。