注册事件的兼容适配

注册事件的方式:

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;
                }
           }


     }

猜你喜欢

转载自blog.csdn.net/qq_41055607/article/details/86560362