Today's the day

思考,自知,耐心


自动闭合 html 标签简化版

return false 在 IE 下失效了?

galeki posted @ 3 months ago in Ruby&Rails进修 with tags IE7
拆分数组

link_to 有个 method 属性,经常拿来配合 confirm 属性做删除链接:

<%= link_to ' Delete', { :action => 'destroy'}, :confirm => "Delete this post?", :method => :post %>

其实就是在链接的 onclick 中创建了一个临时表单,提交请求,最后 return false,这样链接本身就不会被触发:

<a href="/admin/destroy/1234" onclick="...;return false;">Delete</a>

不过发现,在 IE 下这个 return false 并没有效果,onclick 中的表单提交了,链接也触发了,以上面这个为例,点这个链接,会向 /admin/destroy/1234 发送两次请求,一次 post 一次 get 

那么为什么原来没有发现这个问题呢,因为 Rails 生成的控制器代码中都会有这么一句:

  1. verify :method => :post, :only => [ :destroy, :create, :update ],
  2. :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 前面加上一句:

onclick="... event.returnValue = false; return false;"

这样问题就解决了,不过 Rails 链接的 onclick 都是自动生成的,要怎么改呢。

再次拜 Ruby 强大的 OpenClass 所赐:

  1. module ActionView
  2.  module Helpers
  3.   module UrlHelper
  4.    private
  5.    def convert_options_to_javascript!(html_options, url = '')
  6.     ...
  7.     when confirm && popup
  8.       "... ;event.returnValue = false; return false;"
  9.     when confirm && method
  10.       "... ;event.returnValue = false; return false;"
  11.     ...
  12.     when method
  13.       "... event.returnValue = false;return false;"
  14.     when popup
  15.       ... + 'event.returnValue = false;return false;'
  16.     ...    
  17.   end
  18.  end
  19. end

找到 conver_options_to_javascript 这个方法,copy 过来,再添加上高亮部分的代码即可。直接覆盖核心的 private 方法,这种事情干起来真爽……

相关文章
全局相关文章
  • No match

Comments Feed

1
Cite weskycn [Guest] posted @ 2008-05-06 09:26AM
<%= link_to ' Delete', { :action => 'destroy'}, :confirm => "Delete this post?", :method => :post %>

中的:method => :post 应该为 :method => :delete吧?

我看rails自动生成的代码都是这个,呵呵

另外,插入高亮程序代码在IE下不能用,不知道其他人如何,还是我的浏览器的问题


Head_small
galeki

这倒是无所谓,只要 :method 和校检的相对应就可以。

IE7? 我试了下 ok


3
Cite weskycn [Guest] posted @ 2008-05-06 11:03AM

恩,

可能是我的ie6出问题了,呵呵


4
Cite 大猫 [Guest] posted @ 2008-05-30 12:52PM

似乎我用ietester模拟IE6,
IE7和FF2不是模拟
onclick用return false;三个都可以
href用javascript:void(0);三个都可以
onclick用event.returnValue = false; IE可以FF不行
- - 偶还是继续用return false


Head_small
galeki

奇怪,我是测试下来,firefox 都没有问题,IE7 会出现这个问题,加了 event.returnValue = false 之后就都没有问题了。
比较诡异,因为印象中很早以前并没有这样的问题,网上也搜索遇到相同问题的也很少,也许是和某个 js 库冲突的缘故吧。



Login