使用 JavaScript 防止网页导航离开

IT技术 javascript onbeforeunload
2021-02-01 00:21:00

如何防止网页使用 JavaScript 导航?

6个回答

使用onunload允许您显示消息,但不会中断导航(因为为时已晚)。但是,使用onbeforeunload会中断导航:

window.onbeforeunload = function() {
  return "";
}

注意:返回空字符串是因为较新的浏览器提供了诸如“任何未保存的更改都将丢失”之类的无法覆盖的消息。

在较旧的浏览器中,您可以指定要在提示中显示的消息:

window.onbeforeunload = function() {
  return "Are you sure you want to navigate away?";
}
但这还不够。表单内的控件呢?他们也触发了这个。
2021-03-18 00:21:00
浏览器将显示适当的提示。只需使用window.onbeforeunload = function() { return ""; }
2021-03-23 00:21:00
现代浏览器不允许您在提示中显示自定义消息,因为这已被网络钓鱼者等滥用。
2021-03-24 00:21:00
谢谢@Flimm,我已经更新了答案,因此现在对于当前的浏览器来说是准确的。
2021-04-02 00:21:00
这个怎么取消?假设用户已保存所有更改并可自由离开。
2021-04-05 00:21:00

与这里介绍的其他方法不同,这段代码不会导致浏览器显示警告,询问用户是否要离开;相反,它利用 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);
})();

免责声明:您永远不应该这样做。如果页面上有破坏框架的代码,请尊重作者的意愿。

如果用户想要关闭浏览器,如何显示模式(点击关闭)?它真的?
2021-03-24 00:21:00

使用现代 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

如果要删除此事件侦听器,请参阅:stackoverflow.com/a/56546665/247696
2021-03-21 00:21:00
记得正确大写 event.returnValue
2021-03-24 00:21:00

我最终得到了这个略有不同的版本:

var dirty = false;
window.onbeforeunload = function() {
    return dirty ? "If you leave this page you will lose your unsaved changes." : null;
}

在其他地方,当表单变脏时,我将脏标志设置为 true(或者我想防止导航离开)。这让我可以轻松控制用户是否收到确认导航提示。

对于所选答案中的文本,您会看到多余的提示:

在此处输入图片说明

如果它以 undefined 而不是 null 结尾,这是否适用于所有浏览器?
2021-03-13 00:21:00
在 IE 中,如果dirty 为false,则将显示字符串'null'。只需将其包装在 if 语句中即可。请参阅:stackoverflow.com/questions/11793996/...
2021-03-19 00:21:00
同意@JacobvanLingen,这将是此处和其他三个 问题的最佳答案,如果它以结尾而不是 null 结尾。(1) 它是有条件的 (2) 它提到“脏”是阻碍导航的最常见的合法原因,以及 (3) 它有一个屏幕截图。 undefined
2021-04-11 00:21:00

在 Ayman 的示例中,通过返回 false 可以防止浏览器窗口/选项卡关闭。

window.onunload = function () {
  alert('You are trying to leave.');
  return false;
}
除非浏览器是 Opera,如果选项卡/窗口/程序正在关闭,它会跳过 onunload 事件。
2021-03-14 00:21:00
如果它在某个时候起作用,这根本不再起作用:)
2021-03-24 00:21:00