最近在阅读javascript高级程序设计
,事件这一块仍是有不少东西要学的,就把一些思考和总结记录下。
在事件处理,事件对象,阻止事件的传播等方法或对象存在着浏览器兼容性问题,开发过程当中最好编写成一个通用的事件处理工具。javascript
(function(){ var EU = {}; //... //在这里添加一些通用的事件处理方法 //... window.EventUtil = EU; })();
事件的绑定主要为IE8如下浏览器作兼容处理:java
IE8如下只支持事件冒泡
IE事件处理使用attachEvent
detachEvent
segmentfault
EU.addHandler = function(element,type,handler){ //DOM2级事件处理,IE9也支持 if(element.addEventListener){ element.addEventListener(type,handler,false); } else if(element.attachEvent){ //type加'on' //IE9也能够这样绑定 element.attachEvent('on' + type,handler); } //DOM0级事件处理步,事件流也是冒泡 else{ element['on' + type] = handler; } };
和绑定事件的处理基本一致,有一个注意点:浏览器
传入的
handler
必须与绑定事件时传入的相同(指向同一个函数)函数
EU.removeHandler = function(element,type,handler){ if(element.removeEventListener){ element.removeEventListener(type,handler); } else if(element.attachEvent){ element.detachEvent('on' + type,handler); } else{ //属性置空就能够 element['on' + type] = null; } };
注意点:工具
IE下
event
是全局对象,经过window.event
取得this
EU.getEvent = function(event){ return event || window.event; }
注意点:.net
IE下经过
attachEvent
绑定事件,内部this
并不是触发事件的DOM
,而是window;
经过目标对象来获取DOM
节点,IE下是srcElement
属性,等同于其余浏览器的target
属性设计
EU.addTarget = function(event){ return event.target || event.srcElement; }
EU.preventDefault = function(event){ if(event.preventDefault){ event.preventDefault(); } //IE下处理 else{ event.returnValue = false; //默认为true } }
关于事件默认行为code
EU.stopPropagation = function(event){ if(event.stopPropagation){ event.stopPropagation(); } //IE下处理 else{ event.cancelBubble = true;//默认为false,注意区分于returnValue } }
注意点:
阻止的是
DOM层级
间的事件传播
好比:对于一个DOM元素,同时绑定捕获事件与冒泡事件,若是在捕获阶段使用stopPropagation
,不会阻断冒泡事件的执行;(事件捕获早于事件冒泡)
Demo地址:http://jsfiddle.net/0sfck15b/
若是对子元素和父元素以冒泡形式都绑定'click'事件,在子元素的事件处理中使用stopPropagation
阻止事件传播,父元素绑定的click
事件不会执行。
Demo地址:http://jsfiddle.net/av6yebsw/
上面的划掉的地方理解有误,更正下。上面的demo中事件的执行都发生了目标阶段
,事件对象event
的eventPhase
属性用来表示事件处理发生在事件流哪一个阶段。
对应关系 1:捕获阶段,2: 处于目标,3: 冒泡阶段
还有一点:
目标阶段并不必定先发生捕获阶段所绑定的事件,先绑定先执行
demo演示: http://jsfiddle.net/h52xwkrh/
但不变的是对同一个DOM不管在捕获阶段仍是在冒泡阶段使用ev.preventDefault(),都不会阻止另外一个事件执行
欢迎讨论交流!若是文章对你有帮助,点下面的推荐鼓励下呗(๑><๑)