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 = false;
40         }
41     },
42     //阻止事件冒泡
43     stopPropagation: function(event) {
44         if (event.stopPropagation) {
45             event.stopPropagation();
46         } else {
47             event.cancelBubble = true;
48         }
49     }
50 }

  

原文地址:https://www.cnblogs.com/tangyuchen/p/5816431.html