作者ybite (小犬)
看板Ajax
标题Re: [问题] jQuery 的 attr 与 bind
时间Wed Aug 26 03:17:46 2009
先当个乡民Review Code XD
※ 引述《s5846125 (陆奥鬼一)》之铭言:
: 这是原本的写法:
: <img src="xxxx"
: onmouseover="showtrail('XXXX',YY,ZZ);"
: onmouseout="hidetrail();" />
: 後来改成这样:
: <img src="xxxx" onload="imgInit(this);" />
: javascript 用了三种写法才找到解决方法。
: function imgInit(obj) {
: // XXXX 是一个字串, YY ZZ 是 计算出来的数字
: // 写法一: (在 FF 可以执行,在IE 会没有反应)
: jQuery(obj).attr({
: onmouseover:"showtrail('XXXX',YY,ZZ);",
: onmouseout:"hidetrail();"
: });
坦白讲不建议这样作
因为这样会遇到 IE 的 Bug(就是你遇到的),见下
: // 写法二: (在 FF、IE,都可以执行)
: jQuery(obj).bind("mouseover",function(){
: eval("showtrail('XXXX',YY,ZZ);");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 这个Eval好奇怪,不懂
: }).bind("mouseout",function(){
: hidetrail();
: });
: // 写法三: (在 FF、IE,都可以执行)
: jQuery(obj).mouseover(function(){
: eval("showtrail('XXXX',YY,ZZ);");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 同上
: }).mouseout(function(){
: hidetrail();
: });
: }
: 这样是不是代表 .bind("mouseover", fn()) 跟 .mouseover(fn())
: 都是绑成 method,而 .attr("mouseover",fn) 只是绑成 attrib,不会有反应?
: 如果是的话,就写法一的结果,是不是代表 Firefox 跟 IE 的处理方式有不同?
: 有请板上高手解答。谢谢///////////!
这实际上说来很复杂,可以去看 jQuery 的原始码
attr() 系列是透过 DOM 中的 setAttribute / getAttribute 来实作
而旧版的 IE 无法对 on____ 系列的事件作 setAttribute
(参考
http://msdn.microsoft.com/en-us/library/ms536739%28VS.85%29.aspx )
如果你用 IE8 ,加上 IE8 在「IE8 标准模式」下执行就会是对的了 XD
(有关 IE8 神秘的三种文件模式请参考小弟拙文
http://bit.ly/1SpToE )
而因为 IE Bug 的关系,加上 jQuery 自己有提供事件处理
所以不建议用 attr('on_____', '...') 的方式
bind() 和其他 Event 系列的函数则使用完全不同的方式
在 IE 下是利用 attachEvent() 或 detachEvent() (非标准)
在其他浏览器是利用 addEventListener() 和 removeEventListener()(W3C 标准)
jQuery 的 Event 系列函数考量并修正了到很多浏览器的问题
首先光 IE 不支援 W3C 标准的事件处理方式就让人头大(所幸 jQuery 都偷偷修好了)
再来在 IE 下使用 attachEvent() 又会有记忆体泄漏的问题...(所幸也偷修了)
大概是这样子吧, jQuery 的事件处理真的很方便,请务必爱用! :D
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.170.58.124
1F:推 s5846125:首先,感谢大师的讲解。目前是采用写法三,总觉得都要透 08/26 12:09
2F:→ s5846125:过 jQuery 了,那不如用 jQuery 附的方法写。另外 eval() 08/26 12:10
3F:→ s5846125:内,要呼叫 showtrail(),其参数有字串与变数组合而成。 08/26 12:12
4F:→ s5846125:因为不是重点,所以只是随便放个样子。 08/26 12:13
5F:推 tomin:我用IE8标准模式测过 也是不行 08/26 13:12