IE跟随链接甚至在onclick =“return false;”之后

时间:2011-05-04 23:07:41

标签: javascript jquery ruby-on-rails internet-explorer

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

<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&amp; 8 - 我测试过的两个)已经确定最后的return false;不足以阻止它跟随链接,并且我最终得到了两个请求到我的服务器:来自onclick处理程序的POST请求,我想要的,以及来自链接本身的GET请求,我没有。实际上,除了POST请求之外,该路由不存在,因此当浏览器遵循GET请求时,用户将被转储到“错误URL”错误屏幕上。不好。

有没有人见过这个,能告诉我是什么造成的?或者,更好的是,有没有人知道一个好的解决方法?

PS:我更喜欢 NOT

  1. Monkey-patch link-to
  2. 编写我自己的link_to
  3. 版本

    但如果这就是它需要的东西,那就是它需要的东西。我正在使用jQuery 1.5.something,如果有帮助的话。

4 个答案:

答案 0 :(得分:12)

通常,当IE决定从return false;处理程序“忽略”onclick时,这是因为return false;之前的一行引发了异常。这将导致onclick处理程序无声失败,然后浏览器将尝试访问href链接。这适用于所有浏览器,而不仅仅是IE,但通常情况下,IE会在其他浏览器不支持的情况下抛出异常,因此看起来只有IE忽略了return false;

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

答案 1 :(得分:6)

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

event.preventDefault();

所以在你的例子中,你可以使用它(如评论中所讨论的):

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

希望有所帮助!

答案 2 :(得分:4)

我以前遇到过IE的这个问题,并且发现一个有效的解决方案(我相信jQuery的event.preventDefault()所做的事情)是为普通浏览器做return false;,但是对于IE来说,event.returnValue = false;(显然在实际的return之前)。 IE会尊重这一点。

不幸但是,我不知道如何在没有黑客攻击的情况下将其放入link_to助手。这就是我来这里寻找的东西。 :)

答案 3 :(得分:1)

我相信你提交新表格的问题是:

f.submit();

您正在将其提交给您的链接href

f.action = this.href;

所以你对这个地址有所了解。您的链接返回false,但是提交的表单会将您引导到此位置。

所以你的link_to没问题。问题出在您的奇怪的JavaScript中。