ブラウザウィンドウを閉じたときにアラートを取得するために、次のコードを試しました。
window.onbeforeunload = confirmExit;
function confirmExit() {
return "You have attempted to leave this page. If you have made any changes to the fields without clicking the Save button, your changes will be lost. Are you sure you want to exit this page?";
}
動作しますが、ページに1つのハイパーリンクが含まれている場合、そのハイパーリンクをクリックすると同じアラートが発生します。ハイパーリンクをクリックしたときではなく、ブラウザウィンドウを閉じたときにのみアラートを表示する必要があります。
コードをそのままにして、jQueryを使用してリンクを処理します。
$(function () {
$("a").click(function {
window.onbeforeunload = null;
});
});
別の実装は、このWebページで見つけることができる次のとおりです。 http://ujap.de/index.php/view/JavascriptCloseHook
<html>
<head>
<script type="text/javascript">
var hook = true;
window.onbeforeunload = function() {
if (hook) {
return "Did you save your stuff?"
}
}
function unhook() {
hook=false;
}
</script>
</head>
<body>
<!-- this will ask for confirmation: -->
<a href="http://google.com">external link</a>
<!-- this will go without asking: -->
<a href="anotherPage.html" onClick="unhook()">internal link, un-hooked</a>
</body>
</html>
フラグとして変数を使用します。
ハイパーリンクのクリックは検出できますが、ユーザーが次のことを判断することはできません。
これらのアクションはすべて、beforeunload
でwindow
イベントを生成しますが、イベントに関する詳細な情報はありません。
上記のアクションを実行するときに確認ダイアログを表示し、ハイパーリンクがクリックされたときに表示しないようにするには、次の手順を実行します。
beforeunload
イベントリスナーをwindow
に割り当てます。これにより、確認テキストが文字列として返されます。nless特定の変数(フラグ)がtrue
に設定されます。click
イベントをdocument
に割り当てます。 a
要素がクリックされたかどうかを確認します(event.target.tagName
)。はいの場合、フラグをtrue
に設定します。submit
イベントリスナーをdocument
に割り当てることで、フォームの送信も処理する必要があります。
コードは次のようになります。
let disableConfirmation = false;
window.addEventListener('beforeunload', event => {
const confirmationText = 'Are you sure?';
if (!disableConfirmation) {
event.returnValue = confirmationText; // Gecko, Trident, Chrome 34+
return confirmationText; // Gecko, WebKit, Chrome <34
} else {
// Set flag back to false, just in case
// user stops loading page after clicking a link.
disableConfirmation = false;
}
});
document.addEventListener('click', event => {
if (event.target.tagName.toLowerCase() === 'a') {
disableConfirmation = true;
}
});
document.addEventListener('submit', event => {
disableConfirmation = true;
});
<p><a href="https://stacksnippets.net/">google.com</a></p>
<form action="https://stacksnippets.net/"><button type="submit">Submit</button></form>
<p>Try clicking the link or the submit button. The confirmation dialog won't be displayed.</p>
<p>Try reloading the frame (right click -> "Reload frame" in Chrome). You will see a confirmation dialog.</p>
一部のブラウザでは、event.returnValue
はbeforeunload
リスナーで、その他ではreturn
ステートメントを使用します。
beforeunload
event docs もご覧ください。