safariで戻るボタンを押したら、bfcache(Back Forward Cache)が効いて、javascriptのloadingが消えない現象が起きていたので、対応してみました。
原因
chromeでは、特には問題が起きていなかったwebシステムが、safariで開いて戻るボタンを押すと…
javascriptの処理が残った状態になって、ローディングが回り続けてました🤮(クルクルして読み込み待ちするやつです)
bfcache(back forward cache)について
調べてみると、safariではbfcacheが効いているので、戻るを押した場合にchromeと挙動が変わってくるとのこと。
対応策
window.onponbeforeunload / window.onunload / window.onpageshowを呼んであげていろいろ試しましたが、
最終的に、onpageshowにキャッシュが効いていたらページを再ロードする処理を書きました。
javascriptのイベントについて
今回使用した3つのイベントは下記の効果があります。
・onbeforeunload
ページを閉じる直前に呼ばれて、書いた処理が実行されます。
unloadの前に呼ばれます。
・onunload
ページを閉じる時に呼ばれて、書いた処理が実行されます。
beforeunloadの後に呼ばれます。
・onpageshow
ページが開かれたり、更新されたりするたびに呼ばれます。
javascriptでbfcache対応する
共通で呼ばれる箇所に下記のように書きます。
onpageshowでページが開かれたり、更新したり、戻ってきたりした時に呼ばれ、bfcache(event.persistedで判定)が効いてたら画面をリロードします。
window.onpageshow = function(event) {
if (event.persisted) {
window.location.reload();
}
};
typescriptでbfcache対応する
typescriptでwindowのイベントは下記のように書けるようでした。
window.onpageshow = (event) => {
if (event.persisted) {
window.location.reload();
}
};
おわりに
ブラウザバックで戻る場合にも再読み込みを走らせて、初期表示に戻すという対応なので、
再読み込みによる意図しない挙動には注意したいところです☹️
コメント