一般来说,我们为某个对象添加监听事件,使用addEventListener()或attachEvent()函数,那么这两个函数有什么区别呢?
当我们在IE8中为对象添加监听事件时,我们应该使用attachEvent(),而在其它时候,我们则用addEventListener()。
下面是一个为某个对象添加监听事件的通用方法:
//Library.js
function $(id) {
return document.getElementById(id);
};
//为obj对象添加type类型的事件,监听函数是func
function addEvent(obj, type, func) {
if(obj.addEventListener) {
obj.addEventListener(type, func, 'false');
} else if(obj.attachEvent) {
//IE8
obj.attachEvent('on' + type, func);
} else {
obj['on' + type] = func;
}
};
<div id="div1">Click Me</div>
为div1添加点击事件时
addEvent($('div1'), 'click', function() {
alert('hello');
});
无论在IE8或是Chrome或是Firefox中代码都能正常运行。
第二个不同的地方就是它们的事件处理程序的作用域的不同。addEventListener中事件处理函数会在其所属元素作用域内运行,而attachEvent的事件处理程序会在作用域中运行。如
在IE8中:
var myDiv = document.getElementById('myDiv'); myDiv.attachEvent('onclick', function() { alert(this === window); //true });
在其他浏览器中:
var myDiv = document.getElementById('myDiv'); myDiv.addEventListener('click', function() { alert(this === window); false }, false);
第三个不同的地方是使用addEventListener为元素注册的事件是哪个先注册哪个先执行,而attachEvent正好相反。
浙公网安备 33010602011771号