6

我想构建一个 JS 外部脚本(标签),它可以在不使用弹出窗口的情况下阻止诸如 location.href 之类的代码(通常不是我的)发生。我试过这样的事情:

$(window).bind('beforeunload', function() {
 window.stop();
 event.stopImmediatePropagation();
 event.preventDefault();
 location.href = '#';  
 });

但似乎没有任何帮助。再次,我需要它而不使用:返回“你确定吗?” 也许是不同的回调?

谢谢,丹

4

2 回答 2

1

用于确认导航离开的正确方法onbeforeunload是只返回您想要显示的消息的字符串。MDN 有这个说法

该函数应为 Event 对象的 returnValue 属性分配一个字符串值并返回相同的字符串

因此,您onbeforeunload要求的行为的功能就是(与将其与 jquery 绑定相同,特别是因为 onbeforeunload 不像其他事件那样支持多个事件侦听器)

window.onbeforeunload = function() {
    return "Are you sure?";
};

但具有讽刺意味的是,出于安全考虑,Firefox 不支持此功能。

请注意,在 Firefox 4 及更高版本中,返回的字符串不会显示给用户。请参阅错误 588292

编辑:我阅读了更多的错误报告。他们做出此决定的主要原因是:“1. 删除站点提供的文本,因为这是一个安全问题(浏览器对话框中的不可信文本)”。我想知道他们对 a 的感觉如何alert

大多数现代浏览器(Chome、IE 9+ 或更早版本,以及 Opera,我肯定知道)会忽略您在onbeforeunload函数中尝试执行的任何操作,而不是返回一个字符串进行显示。这是为了防止劫持用户的浏览器、打开弹出窗口、通过将用户指向另一个可能是恶意的域来覆盖导航尝试等。

编辑2:我显然是不正确的。只有一些事情是不允许的onbeforeunload,它们只是碰巧主要是您在示例代码中尝试的事情类型,与事件传播和页面导航有关。从该 FF 错误报告的评论中,用户 oyasumi 发布了一个指向此 jsFiddle 的链接,其中包含向 FF 4+ 用户显示自定义文本的解决方法:http: //jsfiddle.net/ecmanaut/hQ3AQ/所以显然调用alert()仍在允许,甚至在 中onbeforeunload,这很有趣,这正是“错误”“修复”的原始原因:在浏览器/应用程序/操作系统/官方外观对话框中显示自定义文本。

于 2013-03-01T22:29:13.647 回答
-1

您是否尝试使用“return false”?此外,您应该将事件发送到您的函数。这是一个示例,您可以在其中防止按钮单击和超链接

<input type="button" value="click me" />
<a href="www.google.com"> google </a>

$(document).ready(function(){
    $('input[type="button"]').click(function(e){
             e.preventDefault();
    });
    $('a').click(function(e){
        e.preventDefault();

    });
});

这是链接http://jsfiddle.net/juTtG/143/

于 2013-02-28T20:30:08.793 回答