二、IE的高級事件處理模型的問題
重復綁定
IE下沒有addEventListener,但是也有自己的attachEvent,即所謂的Microsoft Model。二者的實現(xiàn)基本相同只是attachEvent的第一個參數(shù)(事件類型)需要加”on”,而addEventListener不用,另外attachEvent因為不支持事件捕捉,所以也沒有第三個參數(shù)。
然而,attachEvent還有一個很要命的問題:重復綁定事件。(這是從ppk on JavaScript中學到的)
一個例子:
function sayHello(){ alert('Hello, world!'); } // W3C Model $('div1').addEventListener('click', sayHello, false); $('div1').addEventListener('click', sayHello, false); // Microsoft Model $('div1').attachEvent('onclick', sayHello); $('div1').attachEvent('onclick', sayHello);
在W3C模型中,相同事件處理函數(shù)的綁定會被忽略,也就是說第二個$('div1').addEventListener('click', sayHello, false);會被忽略。
而在Microsoft模型中,第二個$('div1').attachEvent('onclick', sayHello);同樣會被執(zhí)行,所以,當你點擊#div1的時候,alert框會彈出來兩次。更有甚者,在detachEvent時候,也同樣要detachEvent兩次才能徹底把sayHello從#div1的click事件中刪除。
為什么不繼續(xù)使用alertID()了?
這是因為IE的事件模型的另一個缺陷,在alertID中,使用了this關鍵字來指代被委派了該事件處理函數(shù)的元素,這樣,在W3C模型中,alertID中的this指代了#div1或者#div2。
但是在Microsoft模型中,缺少了對this的支持后,this.id就會變?yōu)閡ndefined,因為這時候this指代了window對象。
本文鏈接:http://www.95time.cn/tech/web/2007/5079.asp
出處:三月的蟻穴
責任編輯:tada
上一頁 事件捕捉(Event Capture)的實現(xiàn)問題 下一頁
◎進入論壇網頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|