如何防止网页使用 JavaScript 离开?
10 回答
使用onunload
允许您显示消息,但不会中断导航(因为为时已晚)。但是,使用onbeforeunload
会中断导航:
window.onbeforeunload = function() {
return "";
}
注意:返回一个空字符串是因为较新的浏览器提供了一条无法覆盖的消息,例如“任何未保存的更改都将丢失”。
在较旧的浏览器中,您可以指定要在提示中显示的消息:
window.onbeforeunload = function() {
return "Are you sure you want to navigate away?";
}
与这里介绍的其他方法不同,这段代码不会导致浏览器显示警告,询问用户是否想离开;相反,它利用 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);
})();
免责声明:你不应该这样做。如果页面上有破坏框架的代码,请尊重作者的意愿。
使用现代 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
我最终得到了这个略有不同的版本:
var dirty = false;
window.onbeforeunload = function() {
return dirty ? "If you leave this page you will lose your unsaved changes." : null;
}
在其他地方,当表单变脏时,我将脏标志设置为 true(或者我想阻止导航离开)。这使我可以轻松控制用户是否获得确认导航提示。
使用所选答案中的文本,您会看到多余的提示:
在 Ayman 的示例中,通过返回 false 可以防止浏览器窗口/选项卡关闭。
window.onunload = function () {
alert('You are trying to leave.');
return false;
}
相当于 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();
});
该建议的错误消息可能与浏览器已经显示的错误消息重复。在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事件,但消息可能会或可能不会跨浏览器工作,并且需要返回强制内置提示的内容。
如果您需要在退出时将状态切换回无通知,请使用以下行:
window.onbeforeunload = null;