Ответ 1
Сохраните свой код как есть и используйте jQuery для обработки ссылок:
$(function () {
$("a").click(function {
window.onbeforeunload = null;
});
});
Я попробовал следующий код, чтобы получить предупреждение после закрытия окна браузера:
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?";
}
Это работает, но если страница содержит одну гиперссылку, нажатие на эту гиперссылку вызывает одно и то же предупреждение. Мне нужно показать предупреждение только после закрытия окна браузера, а не при нажатии гиперссылок.
Сохраните свой код как есть и используйте jQuery для обработки ссылок:
$(function () {
$("a").click(function {
window.onbeforeunload = null;
});
});
Другая реализация заключается в следующем: вы можете найти ее на этой веб-странице: 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
, который возвращает текст подтверждения как строку, если для определенной переменной (флага) не установлено значение 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="#" onclick="location.href='https://stacksnippets.net/'; return false;">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>