兼容性问题浏览器
一、ele.on事件类型 = function(){}一个元素ele注册一种事件屡次,会被替换成最后一个,因此有局限性函数
二、addEventListener(事件类型,事件处理函数,useCapture) 第三个参数默认是false,冒泡阶段执行this
三、attachEvent(事件类型,事件处理函数)spa
四、addEventListener、attachEvent在IE兼容性问题上正好能够互补code
基本函数封装对象
<script> //封装成函数,问题是每次都会判断 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; } } </script>
在注册事件的时候,判断浏览器的注册事件的方式,而后直接使用该方式进行注册事件,就像上面那样,代码复用性差blog
解决方案:事件
一、将注册事件的代码封装到一个函数中,在函数中返回函数,让外部函数只执行一次,判断也就只会执行一次ip
二、外部函数只须要调用一次就能够知道客户浏览器的兼容方式是什么,而后利用此次返回的函数,注册事件,能够重复的注册get
<script> 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(){ handler.call(target, window.event); }) } }else{ return function(target, type, handler) { target["on" + type] = handler; } } } window.onload =function () { var div = document.getElementById("div1"); registeEvent(div,"click",function(e){ console.log(e); console.log(this); }) } </script>
须要注意的是IE6的时候只能使用attachEvent来解决兼容性问题,可是attachEvent,是不可以在注册的函数中传入的参数event对象的,它的访问形式都是window.event,此时咱们能够使用call方法,修改传入参数handler函数,将它的参数强行注入进去。