我可以在没有弹出窗口的情况下停止JS location.href吗?

时间:2013-02-28 20:19:16

标签: javascript jquery location href

我想构建一个JS外部脚本(标记),它可以在不使用弹出窗口的情况下停止代码(通常不是我的),就像location.href一样。 我尝试过这样的事情:

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

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

谢谢, 丹

2 个答案:

答案 0 :(得分:1)

使用onbeforeunload确认导航的正确方法是返回您想要显示的消息的字符串。 MDN has this to say

  

该函数应将字符串值赋给Event对象的returnValue属性并返回相同的字符串

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

window.onbeforeunload = function() {
    return "Are you sure?";
};
但具有讽刺意味的是,出于安全考虑,Firefox不支持此功能。

  

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

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

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

编辑2:我显然不正确。在onbeforeunload中只允许某些事物,它们恰好主要是您在示例代码中尝试过的事物类型,与事件传播和页面导航有关。从该FF错误报告的deep in the comments开始,用户oyasumi发布了一个指向此jsFiddle的链接,并向FF 4+用户显示自定义文本:http://jsfiddle.net/ecmanaut/hQ3AQ/因此显然仍然允许调用alert() ,即使在onbeforeunload中,这也正好与“错误”修复“的原因完全相同:在浏览器/应用程序/操作系统/官方外观对话框中显示自定义文本。

答案 1 :(得分:-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/