Answers:
使用onunload
可以显示消息,但不会中断导航(因为为时已晚)。但是,使用onbeforeunload
会中断导航:
window.onbeforeunload = function() {
return "";
}
注意:返回空字符串,因为较新的浏览器提供了诸如“任何未保存的更改将丢失的消息”之类的消息,该消息不能被覆盖。
在较旧的浏览器中,您可以指定要在提示中显示的消息:
window.onbeforeunload = function() {
return "Are you sure you want to navigate away?";
}
window.onbeforeunload = function() { return ""; }
与此处介绍的其他方法不同,这段代码不会导致浏览器显示警告,询问用户是否要离开。相反,它利用DOM的事件性质在浏览器有机会从内存中卸载它之前将其重定向回到当前页面(从而取消导航)。
由于它是通过直接短路导航来工作的,因此不能用来防止页面被关闭;但是,它可以用于禁用帧消除。
(function () {
var location = window.document.location;
var preventNavigation = function () {
var originalHashValue = location.hash;
window.setTimeout(function () {
location.hash = 'preventNavigation' + ~~ (9999 * Math.random());
location.hash = originalHashValue;
}, 0);
};
window.addEventListener('beforeunload', preventNavigation, false);
window.addEventListener('unload', preventNavigation, false);
})();
免责声明:绝对不要这样做。如果页面上有禁止使用框架的代码,请尊重作者的意愿。
我最终得到了这个略有不同的版本:
var dirty = false;
window.onbeforeunload = function() {
return dirty ? "If you leave this page you will lose your unsaved changes." : null;
}
在其他地方,当表单被弄脏时,我将dirty标志设置为true(否则,我想防止导航离开)。这使我可以轻松控制用户是否收到“确认导航”提示。
使用所选答案中的文字,您会看到多余的提示:
使用现代的addEventListener API,以更现代且与浏览器兼容的方式进行等效。
window.addEventListener('beforeunload', (event) => {
// Cancel the event as stated by the standard.
event.preventDefault();
// Chrome requires returnValue to be set.
event.returnValue = '';
});
来源:https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload
event.returnValue
等效于jQuery 1.11中接受的答案:
$(window).on("beforeunload", function () {
return "Please don't leave me!";
});
altCognito的答案使用了该unload
事件,该事件为时已晚,以至于JavaScript无法中止导航。
使用onunload。
对于jQuery,我认为这是这样的:
$(window).unload(function() {
alert("Unloading");
return falseIfYouWantToButBeCareful();
});
unload
事件在用户离开页面时beforeunload
触发,这与之前触发的事件不同(可能会被取消)
该建议的错误消息可能与浏览器已经显示的错误消息重复。在chrome中,这2条类似的错误消息会在同一窗口中依次显示。
在chrome中,自定义消息后显示的文本是:“确定要离开此页面吗?”。在firefox中,它根本不显示我们的自定义错误消息(但仍显示对话框)。
更合适的错误消息可能是:
window.onbeforeunload = function() {
return "If you leave this page, you will lose any unsaved changes.";
}
或stackoverflow样式:“您已开始撰写或编辑帖子。”
如果您在捕获浏览器的后退/前进按钮时不想导航,则可以使用:
window.addEventListener('popstate', function() {
if (window.location.origin !== 'http://example.com') {
// Do something if not your domain
} else if (window.location.href === 'http://example.com/sign-in/step-1') {
window.history.go(2); // Skip the already-signed-in pages if the forward button was clicked
} else if (window.location.href === 'http://example.com/sign-in/step-2') {
window.history.go(-2); // Skip the already-signed-in pages if the back button was clicked
} else {
// Let it do its thing
}
});
否则,您可以使用beforeunload事件,但是该消息可能跨浏览器正常运行,也可能无法跨浏览器运行,并且需要返回强制内置提示的内容。