欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

DOM事件流的三个阶段

程序员文章站 2022-07-02 12:47:23
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流。 DOM事件流分为三个阶段,分别为: 捕获阶段:事件从Document节点自上而下向目标节点传播的阶段; 目标阶段:真正的目标节点正在处理事件的阶段; 冒泡阶段:事件从目标节点自上而下向Document节点传播的阶段。 捕获阶 ......

事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即dom事件流

dom事件流分为三个阶段,分别为:

捕获阶段:事件从document节点自上而下向目标节点传播的阶段;

目标阶段:真正的目标节点正在处理事件的阶段;

冒泡阶段:事件从目标节点自上而下向document节点传播的阶段。

DOM事件流的三个阶段

 

捕获阶段:

 1 <!doctype html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="utf-8">
 6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     <meta http-equiv="x-ua-compatible" content="ie=edge">
 8     <title>document</title>
 9     <style>
10         .father {
11             overflow: hidden;
12             width: 300px;
13             height: 300px;
14             margin: 100px auto;
15             background-color: pink;
16             text-align: center;
17         }
18         
19         .son {
20             width: 200px;
21             height: 200px;
22             margin: 50px;
23             background-color: purple;
24             line-height: 200px;
25             color: #fff;
26         }
27     </style>
28 </head>
29 
30 <body>
31     <div class="father">
32         <div class="son">son盒子</div>
33     </div>
34     <script>
35         var son = document.queryselector('.son');
36         son.addeventlistener('click', function() {
37             console.log('son');
38         }, true);
39         var father = document.queryselector('.father');
40         father.addeventlistener('click', function() {
41             console.log('father');
42         }, true);
43         document.addeventlistener('click', function() {
44             console.log('document');
45         }, true);
46     </script>
47 </body>
48 
49 </html>

控制台输出结果为:

DOM事件流的三个阶段

可以看出捕获阶段 事件是从document节点自上而下向目标节点传播的。

 

冒泡阶段:
 1 <script>
 2         var son = document.queryselector('.son');
 3         son.addeventlistener('click', function() {
 4             console.log('son');
 5         }, false);
 6         var father = document.queryselector('.father');
 7         father.addeventlistener('click', function() {
 8             console.log('father');
 9         }, false);
10         document.addeventlistener('click', function() {
11             console.log('document');
12         })
13     </script>

控制台输出结果为:

DOM事件流的三个阶段

 可以看出冒泡阶段 事件是从目标节点自上而下向document节点传播的。

 

注意:

1、js代码只能执行捕获或者冒泡其中一个阶段(要么是捕获要么是冒泡)

2、onclick和attachevent(ie)只能得到冒泡阶段

3、addeventlistener(type, listener[, usecapture]) 第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认是false),表示在事件冒泡阶段调用事件处理程序

4、实际开发中,我们很少使用事件捕获,我们更关注事件冒泡

5、有些事件是没有冒泡的,比如onblur、onfocus、onmouseenter、onmouseleave

6、事件的冒泡有时会带来麻烦,不过是可以被阻止的,方法是:stoppropagation()

stoppropagation() 方法:终止事件在传播过程的捕获、目标处理或冒泡阶段进一步传播。调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点。