作者TonyQ (沉默是金。)
看板Ajax
标题Re: [ js ] getElementsByClassName for IE6
时间Sun Jul 11 23:42:12 2010
※ 引述《s25g5d4 (死城盗贼)》之铭言:
: 昨天研究了一下一本书
: 征服javascript
: 对其中的this与函数作用域以及fn.call()很有兴趣
: 就写出了这个函数
其实觉得好像刻意为了写this跟call多绕了几圈耶 XD
而且我不太了解为什麽要特地弄个this.a,
其实弄成接回传值就好啦。XD
: if(!document.getElementsByClassName) {
: document.getElementsByClassName=function(classN) { //用运算式创立函数
: var tag=this.firstChild; //this指向document
: this.a=(this==document? [] : null); //每次从外部呼叫函数时
: do{ //清空阵列
: if(tag.hasChildNodes()) {
: document.getElementsByClassName.call(tag,classN);
: /*
: *fn.call(a,arg)将会执行fn()并使fn()的作用域改为a arg则是参数
: *简单的说就是this将会指向到tag
: */
: }
: if(tag.className==classN)
: document.a.push(tag);
: tag=tag.nextSibling;
: }while(tag);
: return document.a;
: };
: }
我先把 getElementsByClassName 先换个名字,
弄个基础测试环境是这个板本
http://fiddle.jshell.net/wWhQY/6/
第一个版本,把奇怪的 document.a 换成抓递回回传值
http://fiddle.jshell.net/wWhQY/7/
第二个版本,把难懂的call换掉。(基本上能不用就不用,除非比较直觉)
http://fiddle.jshell.net/wWhQY/8/
第三个版本,把细部的逻辑拆出来,让主线清楚
http://fiddle.jshell.net/wWhQY/9/
本来想写第四个版本,除了绑document原生物件,加绑绑 prototype,
这样可以更像原生的getElementsByClassName
你可以从任意一个 Element 去取 _getElementsByClassName
http://fiddle.jshell.net/wWhQY/10/
不过测了一下,ie6 不支援从 Element加上prototype function,
所以这个版本就变成firefox only了(但firefox又不需要这东西..XD)
: 写的时候为了document.a搞到焦头烂额...
: 每次执行都要清除一次 那这样执行到第六行时因为回呼函数也会被清除...
: 所以只好改用this.a并加入一个判断式 当this指向document时就清空this.a
: 又因为this指向到document所以此时的this.a等於document.a
: 当执行到第六行时的this就会指向到tag 所以这时候的this.a = tag.a所以给null
: 因为用不到 当变数值指向null时就会被javascript编译器回收
: 总之就是错综复杂 搞到我也乱了XDDDD
: 所以...
: IE6 must die!
其实你会觉得很混乱是因为你没有把flow抓稳,
而全域变数在递回时的操作状态又更为复杂,
这种递回呼叫,把flow抓稳是很重要的事情。:p
用至少一个sample去用脑袋逐行执行到底是必要的。
--
我:一半的日子让你说,我听你说你的所有
______________________________________
______________________________________一半的日子我想说,对你说过去的所有:我
_______________________________________________________
在讨论中妥善扮演兼具聆听与分享的角色,是我们一生的课题。
_______________________________________________________
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.70.191.115
1F:→ TonyQ:btw 我觉得fiddle 对firebug不太友善 XD 有人跟我一样感觉吗 07/11 23:43
2F:→ TonyQ:或者应该反过来说,firebug对iframe不太友善。:p 07/11 23:43
3F:推 s25g5d4:就是..为了用this与call所以故意写的@@ 我是觉得用传值 07/12 00:06
4F:→ s25g5d4:如果有人居心不良的话就爆了@@ 07/12 00:06
5F:→ s25g5d4:一开始的想法就是去抓arguments[1] 07/12 00:07
6F:→ grence:开发还是用firebug,jsFiddle只是为了找个 host..测IE XD 07/12 00:12
7F:→ TonyQ:this/call 一样可以因为居心不良而爆啊..XD 07/12 00:37
8F:→ TonyQ:再说,其实只要把函式隐藏起来,外面调用不到就很安全.. 07/12 00:38
9F:推 adamp3:fiddle真的满不错的啊 07/12 00:41