注册事件的方式:
1,ele.on事件类型 = funtion (){}
2 , addEventListener(事件类型,事件处理函数,userCapture),第三个参数是:可选。布尔值,指定事件是否在捕获或冒泡阶段执行。默认为false ,是在事件冒泡阶段执行,true 是指在事件捕获阶段执行。
3,attachEvent(事件类型,事件处理函数)
function registeEvent(target,type,handler){
if(target.addEventListener){
target.addEventListener(type,handler)
}else if(target.attachEvent){
target.attachEvent("on"+type,handler)
}else{
target["on"+type] = handler;
}
}
三种方式存在的问题:
1,attachEvent 只有ie支持,其他浏览器不支持,addEventListener 谷歌,ie9,火狐,Opera 等都支持。
2、注册的事件的处理函数中的,this指向不一致 ,使用第一种和addEventListener的方式注册的点击事件的回调函数中的this 指向target,但是使用attachEvent的方式注册点击事件的回调函数中的this 指向window
3,3种注册事件的方式中,回调函数内获取事件对象的方式也是不一致的
为了统一方式,用以下办法来改变this指向和event,来达到适配:
function createEventRegister(){
if(window.addEventListener){
return function(target,type,handler){
target.addEventListener(type,handler)
}
}else if(window.attachEvent){
return function(target,type,handler){
target.attachEvent("on"+type,function(){
//这里改变this指向和event对象
handler.call(target,window.event)
})
}
}else{
return function(target,type,handler){
target["on"+type] = handler;
}
}
}