修正パターン(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以前向けの互換用 });

状態:未入力(ダイアログは出ません)

記事に戻る(ページを移動してみる)