自动闭合 html 标签简化版
return false 在 IE 下失效了?
link_to 有个 method 属性,经常拿来配合 confirm 属性做删除链接:
其实就是在链接的 onclick 中创建了一个临时表单,提交请求,最后 return false,这样链接本身就不会被触发:
不过发现,在 IE 下这个 return false 并没有效果,onclick 中的表单提交了,链接也触发了,以上面这个为例,点这个链接,会向 /admin/destroy/1234 发送两次请求,一次 post 一次 get
。
那么为什么原来没有发现这个问题呢,因为 Rails 生成的控制器代码中都会有这么一句:
verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
所以第二次错误的 get 请求就会被转到 list 方法上去,但是即使通过 post 删除成功后,大多数情况也会转到 list 上去,看起来是一样的汗,实际上被转了两次。
问题就在于 IE 忽略了 return false,google 了下,好像碰到这个问题的人不是很多汗,难道是我 rp 问题…… 最后搜到了这个:
onclick="return false;" don't work in IE
看来有人在 CakePHP 的 AjaxHelper 中也发现了这个问题,解决的方法就是在 return false 前面加上一句:
这样问题就解决了,不过 Rails 链接的 onclick 都是自动生成的,要怎么改呢。
再次拜 Ruby 强大的 OpenClass 所赐:
-
module ActionView
-
module Helpers
-
module UrlHelper
-
private
-
def convert_options_to_javascript!(html_options, url = '')
-
...
-
when confirm && popup
-
"... ;event.returnValue = false; return false;"
-
when confirm && method
-
"... ;event.returnValue = false; return false;"
-
...
-
when method
-
"... event.returnValue = false;return false;"
-
when popup
-
... + 'event.returnValue = false;return false;'
-
...
-
end
-
end
-
end
找到 conver_options_to_javascript 这个方法,copy 过来,再添加上高亮部分的代码即可。直接覆盖核心的 private 方法,这种事情干起来真爽……
- 相关文章
- 全局相关文章
-
- No match

中的:method => :post 应该为 :method => :delete吧?
我看rails自动生成的代码都是这个,呵呵
另外,插入高亮程序代码在IE下不能用,不知道其他人如何,还是我的浏览器的问题
galeki
这倒是无所谓,只要 :method 和校检的相对应就可以。
IE7? 我试了下 ok
恩,
可能是我的ie6出问题了,呵呵
似乎我用ietester模拟IE6,
IE7和FF2不是模拟
onclick用return false;三个都可以
href用javascript:void(0);三个都可以
onclick用event.returnValue = false; IE可以FF不行
- - 偶还是继续用return false
galeki
奇怪,我是测试下来,firefox 都没有问题,IE7 会出现这个问题,加了 event.returnValue = false 之后就都没有问题了。
比较诡异,因为印象中很早以前并没有这样的问题,网上也搜索遇到相同问题的也很少,也许是和某个 js 库冲突的缘故吧。