IE跟踪链接,即使在onclick="返回false;"

IE Follows Link Even After onclick="return false;"

本文关键字:quot onclick 返回 false 链接 跟踪 IE      更新时间:2023-09-26

我正在编写一个Rails 2.3.8应用程序,并使用标准的link_to助手。我有合理数量的用户方法而不是GET的链接,所以我将:method => :whatever选项传递给link_to,它生成一个带有onclick处理程序的链接,如下所示(为了可读性添加了缩进):

<a
  onclick="
    var f = document.createElement('form');
    f.style.display = 'none';
    this.parentNode.appendChild(f);
    f.method = 'POST';
    f.action = this.href;
    var s = document.createElement('input');
    s.setAttribute('type', 'hidden');
    s.setAttribute('name', 'authenticity_token');
    s.setAttribute('value', '31M3q8SJkRz7f0R80l42Z2W7O2N7ZrzufhWQYql/Zd8=');
    f.appendChild(s);
    f.submit();
    return false;"
  href="/transactions/1015/transcribe"
>
Enter Data
</a>

现在,不知什么原因,IE (7 &8 -我测试过的两个)已经决定,最后的return false;没有足够的阻止它跟随链接,我最终得到了两个请求到我的服务器:来自onclick处理程序的POST请求,我想要的,以及来自链接本身的GET请求,我没有。事实上,除了POST请求之外,该路由不存在,所以当浏览器遵循GET请求时,用户会被"坏URL"错误屏幕抛弃。不好。

有人见过这种情况吗,能告诉我是什么引起的吗?或者,更好的是,有人知道一个好的解决方案吗?

PS:

我喜欢不是,

  1. 猴子补丁link-to
  2. 写自己的link_to版本

但如果那是必须的,那就是必须的。我用的是jQuery 1.5。如果有帮助的话。

一般来说,当IE决定"忽略"来自onclick处理程序的return false;时,这是因为return false;之前的一行抛出了异常。这将导致onclick处理程序静默失败,然后浏览器将尝试访问href链接。这适用于所有浏览器,而不仅仅是IE,但通常情况下,IE会抛出异常的情况下,其他浏览器不会,因此为什么似乎只有IE是忽略return false;

一个快速的补丁是设置href="#",这将保持浏览器在页面上,即使onclick处理程序失败。然而,调试它的正确方法是将onclick代码包装在类似try { ... } catch (ex) { alert(ex); }的代码中,以查看异常是什么,然后修复onclick代码,以便它不再抛出异常。

为了防止JQuery中的表单提交,我们经常使用

event.preventDefault();

所以在你的例子中,你可以使用这个(在注释中讨论过):

$('a[onclick]').click(function(e) {e.preventDefault();});

希望有帮助!

我以前在IE遇到过这个问题,并发现一个有效的解决方案(我认为这是jQuery的event.preventDefault()在掩护下做的),是为正常浏览器做return false;,但也为IE做event.returnValue = false;(在实际的return之前,显然)。IE会尊重的。

不幸的是,我不知道如何在不破坏它的情况下将其滑入link_to helper。这正是我来找的。:)

我认为您提交新表单的问题:

f.submit();

,你把它提交到你的链接href

f.action = this.href;

所以你是按照这个地址来的。您的链接返回false,但提交的表单将您引导到此位置。

所以你的link_to是好的。