修正パターン(preventDefault+returnValue)
下のフォームに何か入力してから、ページ下部の緑のリンクを踏んでみてください。ブラウザの確認ダイアログが出て、「キャンセル」を選べばこのページに留まれます。
未入力のままなら、リンクを踏んでもダイアログは出ません(守るべき入力がないため)。また、ページを開いてから一度もクリックや入力をしていない状態では、正しいコードでもブラウザがダイアログを出しません(sticky activation。記事の原因2)。
let isDirty = false;
form.addEventListener('input', () => {
isDirty = true;
});
window.addEventListener('beforeunload', (event) => {
if (!isDirty) return; // 未入力なら警告しない
event.preventDefault(); // 現行の標準的な書き方
event.returnValue = true; // Chrome/Edge 118以前向けの互換用
});
記事に戻る(ページを移動してみる)