作者s25g5d4 (死城盗贼)
看板Ajax
标题[ js ] getElementsByClassName for IE6
时间Sun Jul 11 19:33:37 2010
昨天研究了一下一本书
征服javascript
对其中的this与函数作用域以及fn.call()很有兴趣
就写出了这个函数
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;
};
}
写的时候为了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!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.172.95.198
1F:→ TonyQ:this/call/apply是很重要的观念,我下一集就打算写 scope 07/11 20:04
2F:→ TonyQ:会提到这东西 07/11 20:04
3F:→ s25g5d4:什麽东西的下一集? 07/11 20:18
4F:→ TonyQ: js 踩到雷系列 XD 其实这个题目已经想好很久了 苦无时间下 07/11 22:13
5F:推 godisempty:TonyQ大有Blog吗 07/11 23:18
6F:→ TonyQ:没 :p 没写blog的习惯 07/11 23:42
7F:→ grence:要取所有element不是用 all or getElementsByTagName('*')? 07/12 00:49
8F:→ TonyQ:通常不会用all啦,不过後面那个我还真的是没看过。XD 07/12 00:53
9F:→ TonyQ:测过还真的是ie6,7,8,fx都support,真不错。笔记下来XD 07/12 00:53