作者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
→ TonyQ:this/call/apply是很重要的觀念,我下一集就打算寫 scope 07/11 20:04
→ TonyQ:會提到這東西 07/11 20:04
→ s25g5d4:什麼東西的下一集? 07/11 20:18
→ TonyQ: js 踩到雷系列 XD 其實這個題目已經想好很久了 苦無時間下 07/11 22:13
推 godisempty:TonyQ大有Blog嗎 07/11 23:18
→ TonyQ:沒 :p 沒寫blog的習慣 07/11 23:42
→ grence:要取所有element不是用 all or getElementsByTagName('*')? 07/12 00:49
→ TonyQ:通常不會用all啦,不過後面那個我還真的是沒看過。XD 07/12 00:53
→ TonyQ:測過還真的是ie6,7,8,fx都support,真不錯。筆記下來XD 07/12 00:53