【 tulaoshi.com - Web开发 】
二、IE的高级事件处理模型的问题
重复绑定
IE下没有addEventListener,但是也有自己的attachEvent,即所谓的MicrosoftModel。二者的实现基本相同只是attachEvent的第一个参数(事件类型)需要加”on”,而addEventListener不用,另外attachEvent因为不支持事件捕捉,所以也没有第三个参数。
然而,attachEvent还有一个很要命的问题:重复绑定事件。(这是从ppkonJavaScript中学到的)
一个例子:
functionsayHello(){
alert('Hello,world!');
}
//W3CModel
$('div1').addEventListener('click',sayHello,false);
$('div1').addEventListener('click',sayHello,false);
//MicrosoftModel
$('div1').attachEvent('onclick',sayHello);
$('div1').attachEvent('onclick',sayHello);
在W3C模型中,相同事件处理函数的绑定会被忽略,也就是说第二个$('div1').addEventListener('click',sayHello,false);会被忽略。
而在Microsoft模型中,第二个$('div1').attachEvent('onclick',sayHello);同样会被执行,所以,当你点击#div1的时候,alert框会弹出来两次。更有甚者,在detachEvent时候,也同样要detachEvent两次才能彻底把sayHello从#div1的click事件中删除。
为什么不继续使用alertID()了?
这是因为IE的事件模型的另一个缺陷,在alertID中,使用了this关键字来指代被委派了该事件处理函数的元素,这样,在W3C模型中,alertID中的this指代了#div1或者#div2。
但是在Microsoft模型中,缺少了对this的支持后,this.id就会变为undefined,因为这时候this指代了window对象。