addEvent()

Dean Edwards寫的這個函式一直是我愛用的檔案,可以在各種瀏覽器上都正常的處理事件的指派,一般而言,事件的指派除了IE的attachEvent和W3C的addEventListenr外,還有一個最傳統的方法就是直接設定該elementNode的屬性,要指派click事件就可以寫成elem.onclick = func;,不過這個方法有個缺點是一個element的同一種事件只能指定一個function,因此一般而言都還是會使用attachEvent和addEventListener。

不過在2005年八月的時候Peter-Paul Koch發現attachEvent的兩個問題,發表在addEvent() considered harmful這篇文章裡,他發現的兩個問題分別是可能會造成記憶體缺漏和this這個關鍵字的錯誤定義,正常來說this應該是指事件指派的element,但是attachEvent卻會讓他變成window這個物件,而在這篇文章之後,他就舉辦了一次比賽希望有人能解決這個問題。

Dean Edwards就是在這時候寫了events.js這個檔案的,其實我一直以為Dean Edwards就是這次比賽的勝者了,直到昨天我才發現勝者其實是John Resig,jQuery的開發者,同時也是Pro Javascript Technique的作者,他寫出來的code非常精簡,只有15行,不過有些小缺憾,Koch還有簡單修改過,放在... and the winner is ...這篇文章裡,他的script可以解決上面提到的問題,但是他至少要瀏覽器支援addEventListener或attachEvent其中一個function,像是Mac版的IE5就剛好兩邊都不支援,用這個script就會沒反應,因此我還是比較喜歡Dean Edwards的版本,他的版本則是addEventListener和傳統方法擇一,因此即使兩個function都不支援,還是可以正常運作,根據測試,連IE4和NN4都可以用,唯一的問題是還有多少人會用這兩款瀏覽器了XD。

其他補充一下:IE7正式版還是沒支援addEventListener。