首页 > 代码库 > DOM事件探秘
DOM事件探秘
说到DOM事件,就不得不说以下几点:
1 事件流
事件流:描述的是从页面中接受事件的顺序
事件流分为事件冒泡流和事件捕获流。那么什么是事件冒泡,什么是事件捕获呢?
事件冒泡:即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的那个节点(文档)。
事件捕获:不太具体的元素最早接收事件,而不太具体的元素最后接收事件。它跟事件冒泡是一个截然相反的概念。
2 事件处理程序
2.1 HTML事件处理程序
如下将事件处理程序嵌入到HTML元素当中
<div> <input type="button" value="按钮" id="btn1" onclick="showMes()"/></div>
<script type="text/javascript">
function showMes(){
alert(‘Hello World!‘);
}
</script>
2.2 DOM 0级事件处理程序 (用得比较多的)
下面的DOM 0级添加和删除事件事件处理程序的表现形式:
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>DOM事件探秘</title> 7 </head> 8 9 <body>10 <input type="text" value="按钮2" id="btn2" />11 <script type="text/javascript">12 var oBtn2 = document.getElementById("btn2");13 //DOM 0级添加事件处理程序14 oBtn2.onclick = function(){15 alert("这是通过DOM 0级添加的事件处理程序");16 }17 //DOM 0级删除事件处理程序18 oBtn2.onclick = null;19 </script>20 </body>21 </html>
2.3 DOM 2级事件处理程序
DOM 2级事件处理程序定义了两个方法:用于指定和删除事件处理程序的操作:
addEventListener()和removeEventListener(),它们接收三个参数: 要处理的事件名,作为事件处理程序的函数和布尔值(false代表事件冒泡)
下面的DOM 2级添加和删除事件事件处理程序的表现形式:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM事件探秘</title> 6 </head> 7 <body> 8 <input type="button" value="按钮3" id="btn3" /> 9 <script type="text/javascript">10 function showMes(){11 alert(‘这是通过DOM 2添加的事件处理程序‘);12 }13 var btn3 = document.getElementById(‘btn3‘);14 // DOM 2级添加事件处理程序15 btn3.addEventListener(‘click‘,showMes,false);16 // DOM 2级删除事件处理程序17 btn3.removeEventListener(‘click‘,showMes,false); 18 </script> 19 </body>20 </html>
2.4 IE事件处理程序 (支持IE事件处理程序的浏览器是IE和Opera)
IE事件处理程序提供了两个类似DOM的方法:attachEvent()和detachEvent(),它们接收相同的两个参数:要处理的事件名,作为事件处理程序的函数
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM事件探秘</title> 6 </head> 7 <body> 8 <input type="button" value="按钮3" id="btn3" /> 9 <script type="text/javascript">10 function showMes() {11 alert(‘IE事件处理程序‘);12 }13 var btn3 = document.getElementById(‘btn3‘);14 // DOM 2级添加事件处理程序15 btn3.attachEvent(‘click‘, showMes);16 // DOM 2级删除事件处理程序17 btn3.detachEvent(‘click‘, showMes);18 </script>19 </body>20 </html>
2.5 跨浏览器的事件处理程序,将其封装在一个对象里,暂时就给它封装两个方法,添加事件和删除事件
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM事件探秘</title> 6 </head> 7 <body> 8 <input type="button" value="按钮3" id="btn3" /> 9 <script>10 var eventUtil = {11 // 添加句柄12 addHandler:function(ele,type,handler){13 if(ele.addEventListener){14 ele.addEventListener(type,handler,false);15 } else if(ele.attachEvent){16 ele.attachEvent(‘on‘+type,handler);17 } else {18 ele[‘on‘+type] = handler;19 }20 },21 removeHandler:function(ele,type,handler){22 if(ele.removeEventListener){23 ele.removeEventListener(type,handler,false);24 } else if(ele.detachEvent){25 ele.detachEvent(type,handler);26 } else {27 ele[‘on‘+type] = handler;28 }29 }30 }31 </script>32 </body>
3 事件对象
什么是事件对象?在触发DOM上的事件时都会产生一个对象event,在IE8以前是window.event
3.1 DOM中的事件对象(以下是比较常见的属性和方法)
(1) type属性 用于获取事件类型
(2) target属性 用于获取事件目标
(3) stopPropagation()方法 用于阻止事件冒泡
(4) preventDefault()方法 阻止事件的默认行为
3.2 IE中的事件对象
(1) type属性 用于获取事件类型
(2) srcElement属性 用于获取事件目标
(3) cancelBubble属性 用于阻止事件冒泡,设置为true表示阻止冒泡,设置为false表示不阻止冒泡
(4) returnValue属性 用于阻止事件的默认行为,设置为false表示阻止事件的默认行为,设置为true表示不阻止事件的默认行为
4 封装event.js,解决浏览器兼容问题
1 var eventUtil = { 2 // 添加句柄 3 addHandler: function(ele, type, handler) { 4 if (ele.addEventListener) { 5 ele.addEventListener(type, handler, false); 6 } else if (ele.attachEvent) { 7 ele.attachEvent(‘on‘ + type, handler); 8 } else { 9 ele[‘on‘ + type] = handler;10 }11 },12 //删除句柄13 removeHandler: function(ele, type, handler) {14 if (ele.removeEventListener) {15 ele.removeEventListener(type, handler, false);16 } else if (ele.detachEvent) {17 ele.detachEvent(type, handler);18 } else {19 ele[‘on‘ + type] = handler;20 }21 },22 //获取事件23 getEvent: function(event) {24 return event ? event : window.event;25 },26 //获取事件类型27 getType: function(event) {28 return event.type;29 },30 //获取事件的目标31 getElement: function(event) {32 return event.target || event.srcElement;33 },34 //阻止事件的默认行为35 preventDefault: function(event) {36 if (event.preventDefault) {37 event.preventDefault();38 } else {39 event.returnValue = http://www.mamicode.com/false;40 }41 },42 //阻止事件冒泡43 stopPropagation: function(event) {44 if (event.stopPropagation) {45 event.stopPropagation();46 } else {47 event.cancelBubble = true;48 }49 }50 }
DOM事件探秘