addEventListener 和attachEvent 兼容性封装
来源:互联网 发布:银河证券软件手机版 编辑:程序博客网 时间:2024/06/06 07:26
addEventListener 和attachEvent 兼容性封装
addEventListener 和attachEvent 是DOM2级事件绑定的方法,但是IE只支持attachEvent ,并且在有同一个事件源执行多个事件名相同的方法时,会有this指向,顺序,重复的问题,下面函数是进行封装的,兼容所有的浏览器。 var tempFn = null; function bind(curEle,eventType,eventFn){ if("addEventListener" in document){ curEle.addEventListener(eventType,eventFn,false); return; } //解决this指向问题,并记录改变this前的eventFn tempFn = function(){ eventFn.call(curEle) } tempFn.photo = eventFn; //判断该自定义属性之前是否存在,不存在就创建,存储多个方法改变this指向后的结果 if(!curEle['myBind'+eventType]){ curEle['myBind'+eventType] = []; } //解决重复问题 // 添加前,看一下之前是否已经有了,有了就不添加,也不往事件池中存储 var ary = curEle['myBind'+eventType] for(var i = 0 ; i < ary.length; i++){ if(ary[i].photo == eventFn){ return; } } ary.push(tempFn); curEle.attachEvent("on"+eventType,tempFn); } function unbind(curEle,eventType,eventFn){ if("removeEventListener" in document){ curEle.removeEventListener(eventType,eventFn,false); return; } var ary = curEle['myBind'+eventType]; for(var i = 0 ; i < ary.length; i++){ if(ary[i].photo == eventFn){ //找到后解除绑定 curEle.detachEvent("on"+eventType,ary[i]); //移除自定义属性中对应的那一项 arr.splice(i,1); break; } } } //解决顺序问题 function on(curEle,eventType,eventFn){ if(!curEle['myBind'+eventType]){ curEle['myBind'+eventType] = []; } var ary = curEle['myBind'+eventType] for(var i = 0 ; i < ary.length ; i++){ var cur = ary[i]; if(cur == eventFn){ return; } } ary.push(eventFn); bind(curEle,eventType,run) } function off(curEle,eventType,eventFn){ var ary = curEle['myEvent' + eventType]; for(var i = 0 ; i < ary.length; i++){ var cur = ary[i]; if(cur == eventFn){ ary.splice(i,1) } } } function run(e){ e = e || window.event var flag = e.target? true:false; if(!flag){ e.target = e.srcElement; e,pageX = e.clientX +(document.documentElement.scrollLeft || document.body.scrollLeft) e,pageY = e.clientY +(document.documentElement.scrollTop || document.body.scrollTop) e.preventDefault = function(){ e.returnValue = false } e.stopPropagation = function(){ e.cancelBubble = true; } } //this ----> e.target var ary = this['myEvent'+e.type]; for(var i = 0 ; i < ary.lengthl i++){ var tempFn = ary[i]; tempFn.call(this,e); } }
阅读全文
0 0
- addEventListener 和attachEvent 兼容性封装
- attachEvent和addEventListener
- attachEvent和addEventListener使用方法
- attachEvent和addEventListener 使用方法
- attachEvent和addEventListener
- attachEvent和addEventListener
- attachEvent 和addEventListener
- addEventListener和attachEvent区别
- js addEventListener和attachEvent
- window.attachEvent和addEventListener
- attachEvent和addEventListener详解
- Js addEventListener 和 attachEvent
- attachEvent和addEventListener详解
- addEventListener() 和 attachEvent()
- 关于attachEvent和addEventListener
- addEventListener和attachEvent
- addEventListener()和attachEvent()
- addEventListener()和attachEvent()跨浏览器的兼容性处理 — 第13.2.5节
- IS-IS的报文——SNP
- machine learning学习笔记(第一周)
- 判断一个节点是否是另一个元素的子节点
- js实现继承的六种方式
- 每周学习20171019
- addEventListener 和attachEvent 兼容性封装
- 利用客服消息和模板消息实现微信群发(突破群发接口的上限)
- 数据中心战略:更好地进行容量规划的技巧
- js的浏览器各种提示框
- Springmvc下载Excel案例(一)
- NUll和Undefined的区别
- 格式化时间插件
- HTTP报文
- 追 酷壳