1. DOM0级事件处理程序(属性绑定,兼容性好)
通过javascript制定事件处理程序的传统方式,将一个函数赋值给一个事件处理程序属性。特点是简单,跨浏览器。var btn = document.getElementById("btn");
btn.onclick = function(){
alert('cliked');
}
dom0级方法制定的事件处理程序被认为是元素的方法,因此这个时候事件处理程序是在元素的作用域中运行,this指向当前元素。
btn.onclick = null; //删除事件处理程序
2. DOM2级事件处理程序(函数绑定,兼容性不好)
1. 非IE
DOM2级规范以一种符合逻辑的方式来标准化DOM事件,IE9,Firefox,Opera,Safari,Chrome全部已经实现了"DOM2级事件"模块的核心部分。IE8是最后一个仍然使用其专有事件系统的主要浏览器。
addEventListener()事件绑定
参数:
要绑定的事件名
作为事件处理的函数
布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用
removeEventListener()
事件删除
参数:
要删除的事件名
作为事件处理的函数
布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用
例如:
//事件绑定
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
alert(this.id); //该函数在其依附的元素的作用域中运行。
},false);
//事件移除
var btn = document.getElementById("btn");
var handler = function(){
alert(this.id);
}
btn.addEventListener("click",handler,false);
btn.removeEventListener("click",handler,false);//移除
可以添加多个事件处理程序,并且按照添加她们的顺序触发。移除事件传入的参数与添加处理程序时使用的参数相同,添加事件时如果使用匿名函数将无法删除
2. IE事件处理程序
事件处理程序会在全局作用域中运行,因此this指向window对象。为一个对象添加两个相同的事件,事件处理程序的顺序是按照添加相反顺序进行处理
attachEvent()
事件绑定
参数:
事件处理程序名称
事件处理函数
detachEvent()
事件移除
参数:
事件处理程序名称
事件处理函数
事件处理程序都被添加到冒泡阶段
3. 跨浏览器的事件处理程序
var outer = document.getElementById("outer");
var center = document.getElementById("center");
var inner = document.getElementById("inner");
function handler(){
alert(this.id);
}
//事件绑定 IE/firefox浏览器
eventUtil.bind(inner,"click",handler);
//事件解绑
eventUtil.unbind(inner,"click",handler);
var eventUtil = {
/**
@param src事件源,type事件类型,fn事件处理函数
*/
bind:function(src,type,fn){
if(src.addEventListener){
src.addEventListener(type,fn,false);
}else if(src.attachEvent){
src.attachEvent("on"+type,fn);
}else{
src["on"+type] = fn;
}
},
unbind:function(src,type,fn){
if(src.removeEventListener){
src.removeEventListener(type,fn,false);
}else if(src.detachEvent){
src.detachEvent("on"+type,fn);
}else {
src["on"+type] = null;
}
}
};
4.区别:
如果定义了两个dom0级事件,dom0级事件会覆盖
dom2不会覆盖,会依次执行
dom0和dom2可以共存,不互相覆盖,但是dom0之间依然会覆盖