看板 Ajax 關於我們 聯絡資訊
昨天研究了一下一本書 征服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
TonyQ:test case http://fiddle.jshell.net/pz3rX/ 07/12 00:54