Chrome 117 で Developer trial として unload イベントを削除するための取り組みが始まるようです
まずは unload イベントリスナを追加するための Permission-Policy を追加するみたいです
最初はデフォルトで許可されていて 徐々にデフォルトで拒否に移行していくそうです
そして最終的に unload イベントのサポートを削除するのが目的だそうです
理由は現状でちゃんと動いてなくて信頼性が低いかららしいです
ブラウザによっては動かないものもあり 環境次第となっていて実質標準とは言えない状態みたいですね
特に BFCache との相性が悪いです
BFCache が有効だとページ遷移でページが表示されなくなっても復元される可能性があるので unload されたとは言えないです
それでページ遷移のときに unload を呼び出さなければ そのままそのページに戻って来ないと永遠に unload されないです
なので Chrome は unload リスナがついていたら BFCache は無効になるような挙動だったはずです
Safari は以前からずっと unload イベントが起きないです
以前これで困ったことがあります
でも Chrome だけでも動いてほしいことがあったので 削除されるのはやっぱり困りそうです
代替候補はやっぱり pagehide でしょうか
beforeunload もありますが ユーザーによるキャンセルが可能なので キャンセルされるかもしれないです
pagehide はタブを閉じたり リロードしたり 進む戻るで移動をしたり 新規にナビゲーションしたりでページが見えなくなったときに起きるイベントです
BFCache などで復元されるされない関係なしです
タブの切り替えや ウィンドウの最小化で見えなくなる場合はイベントが起きないです
基本はこれで良さそうですが unload ではないので JavaScript の状態がそのままで復元される可能性があるというのは気をつけないといけないです
あとは pagehide の理由としてリロードとかタブを閉じるとか戻るとかが受け取れればいいのですけどね
const win = window.open(location.href)
win.addEventListener("load", () => console.log("event load"))
win.addEventListener("unload", () => console.log("event unload"))
win.addEventListener("pageshow", () => console.log("event pageshow"))
win.addEventListener("pagehide", () => console.log("event pagehide"))
event pagehide
event unload
event load
event pageshow
(開いたタブを閉じる)
event pagehide
event unload