我想构建一个 JS 外部脚本(标记),它可以在不使用弹出窗口的情况下停止代码(通常不是我的),如 location.href。 我试过这样的事情:
$(window).bind('beforeunload', function() {
window.stop();
event.stopImmediatePropagation();
event.preventDefault();
location.href = '#';
});
但似乎没有任何帮助。 再次,我需要它而不使用: return "are you sure?" 也许是不同的回调?
谢谢, 丹
最佳答案
使用onbeforeunload
确认导航离开的正确方法是只返回您想要显示的消息的字符串。 MDN has this to say .
The function should assign a string value to the returnValue property of the Event object and return the same string
因此,您的 onbeforeunload
函数对于您要求的行为将只是(与将其与 jquery 绑定(bind)相同,特别是因为 onbeforeunload 不像其他事件那样支持多个事件监听器)
window.onbeforeunload = function() {
return "Are you sure?";
};
但具有讽刺意味的是,出于安全目的,Firefox 不支持这一点。
Note that in Firefox 4 and later the returned string is not displayed to the user. See bug 588292.
编辑:我阅读了更多错误报告。他们做出此决定的主要原因是:“1. 删除站点提供的文本,因为这是一个安全问题(浏览器对话框中的不受信任的文本)”。我想知道他们对 alert
有何看法?
大多数现代浏览器(Chome、IE 9+ 或更早版本,以及 Opera,我肯定知道)会忽略您在 onbeforeunload
函数中尝试执行的任何操作,除了返回要显示的字符串。这是为了防止劫持用户浏览器、打开弹出窗口、通过将用户指向另一个可能是恶意域等来覆盖导航尝试。
编辑 2:我显然是不正确的。在onbeforeunload
中只有一些 事情是不允许的,它们恰好主要是您在示例代码中尝试的事情类型,与事件传播和页面导航有关。来自 deep in the comments在该 FF 错误报告中,用户 oyasumi 发布了指向此 jsFiddle 的链接,其中包含用于向 FF 4+ 用户显示自定义文本的解决方法:http://jsfiddle.net/ecmanaut/hQ3AQ/所以显然调用 alert()
仍然被允许,即使在 onbeforeunload
中,这很有趣地做了“错误”“修复”的最初原因:显示自定义文本在浏览器/应用程序/操作系统/看起来像官方的对话框中。
关于javascript - 我可以在没有弹出窗口的情况下停止 JS location.href 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144899/