前陣子才注意到的問題,顯然都被 JavaScript library 慣壞了,就是 getElementById 這個函式其實只有 document 物件 才有,element 物件 是沒有的,因為一份文件中,每個 id 都必須要是唯一的。而如果是用 jQuery 想要找某個節點下面的某 id,直接用 find,根本也不太會注意這個問題,最近我比較常接觸的 mootools 還直接實作了 element 的 getElementById 函式,不過問題就來了,它的實作其實還是去用 document 的 getElementById (因為 id 唯一),但是我去給他找的目標 element ,其實是動態產生,還沒有放進 document 的節點,所以它的實作方法就會找不到我要的目標。
於是我改用 jQuery ,更精確的一點說我是用 Sizzle,結果我發現用 find 狀況依舊,因為 Sizzle 引擎有對選擇器做一些最佳化,如果看到是"#id"
這樣的形式,就會直接用document.getElementById()
,然後就悲劇重演了~
結果目前這種狀況我是只能先用*#id
這樣的寫法來給 Sizzle 處理,應該會去報 jQuery 和 mootools 的 bug。這問題我也有在 W3C 中文興趣小組的討論群組裡面 提出,目前還沒空回文,有興趣的可以一起來參與討論啊。