【问题标题】:Can I stop JS location.href without a popup?我可以在没有弹出窗口的情况下停止 JS location.href 吗?
【发布时间】:2013-02-15 04:43:13
【问题描述】:

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

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

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

谢谢, 丹

【问题讨论】:

  • 不可能。在没有用户输入的情况下停止导航会破坏浏览的工作方式。
  • 我也有同样的感觉。以 Firefox 为例,出于安全原因,他们故意阻止覆盖 window.location.href。见this bug in bugzilla
  • 其实是可以的。否则,询问您是否要“离开并丢失更改”的网站将不存在。 beforeunload 事件存在,即使您关闭窗口而没有冲浪,它也会捕获。

标签: javascript jquery location href


【解决方案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/

【讨论】:

  • 在 jQuery 中调用 return false 就像同时调用 e.preventDefault() 和 e.stopPropagation() .. 正如 JQuery John Resig 的创建者所解释的那样:mail-archive.com/jquery-en@googlegroups.com/msg71371.htmljquery.10927.n7.nabble.com/…
  • return false 在这种情况下(没有“”offcourse),在弹出窗口中打印“return flase”,这很奇怪,但这就是发生的事情,所以对我不利。而且我没有输入按钮或 href,我有一个 Flash(不是我的),它调用一个执行 location.href='url' 的 JS 方法。但是感谢您的指导
  • 很抱歉,return false 被遗漏了
【解决方案2】:

使用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 ,这很有趣,这正是“错误”“修复”的最初原因:在浏览器/应用程序/操作系统/官方外观对话框中显示自定义文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多