Ich habe den folgenden Code ausprobiert, um beim Schließen eines Browserfensters eine Warnung zu erhalten:
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?";
}
Es funktioniert, aber wenn die Seite einen Hyperlink enthält, wird durch Klicken auf diesen Hyperlink die gleiche Warnung ausgelöst. Ich muss die Warnung nur anzeigen, wenn ich das Browserfenster schließe und nicht, wenn ich auf Hyperlinks klicke.
Behalten Sie Ihren Code bei und verwenden Sie jQuery, um mit Links umzugehen:
$(function () {
$("a").click(function {
window.onbeforeunload = null;
});
});
Eine andere Implementierung ist die folgende, die Sie auf dieser Webseite finden können: 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>
Sie verwenden eine Variable als Flag.
Sie können Hyperlink-Klicks erkennen, aber nicht feststellen, ob Benutzer:
Alle diese Aktionen erzeugen ein beforeunload
-Ereignis auf window
, ohne genauere Informationen über das Ereignis zu haben.
Gehen Sie folgendermaßen vor, um das Bestätigungsdialogfeld anzuzeigen, wenn Sie die obigen Aktionen ausführen, und es nicht anzuzeigen, wenn auf einen Hyperlink geklickt wurde:
beforeunload
Ereignis-Listener window
zu, wodurch der Bestätigungstext als Zeichenfolge zurückgegeben wird , sofern nicht eine bestimmte Variable ( flag) wird auf true
gesetzt.click
Ereignis document
zu. Prüfen Sie, ob das Element a
angeklickt wurde (event.target.tagName
). Wenn ja, setzen Sie das Flag auf true
.Sie sollten Formularübermittlungen auch bearbeiten, indem Sie submit
einen document
-Ereignislistener zuweisen.
Ihr Code könnte so aussehen:
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>
Beachten Sie, dass Sie in einigen Browsern event.returnValue
In beforeunload
Listener und in anderen return
Anweisungen verwenden müssen.
Siehe auch beforeunload
event docs .