我正在编写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
link-to
或link_to
但如果这就是它需要的东西,那就是它需要的东西。我正在使用jQuery 1.5.something,如果有帮助的话。
答案 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中。