码迷,mamicode.com
首页 > Web开发 > 详细

JS中的事件传播流程

时间:2019-08-02 22:52:21      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:listen   document   idt   两种   asc   窗口   bsp   元素   style   

JS中的事件传播流程

1,Javascript与HTML之间的交互是通过事件实现的。

  事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。 

  可以使用侦听器来预定事件,以便事件发生时执行相应代码。

2,DOM事件流存在三个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。

事件流:事件发生时,事件在元素节点与根节点之间的顺序传播,路径所经过的所有节点都会收到该事件,这个传播过程即DOM事件流。事件传播顺序的两种事件流模型:事件冒泡,事件捕获。

事件捕获(event capturing):事件从最不确定的事件目标到最特定的事件目标。当鼠标点击或触发dom事件时,浏览器会从根节点开始有外向内进行事件传播,会先触发父元素,再触发子元素,由外向内层层递进。

事件冒泡(dubbed bubbling):与事件捕获刚好相反,它是由内向外进行事件触发,即从最确定的事件到最不确定的事件。

3,事件传播

通俗来讲,事件传播是从外向内,然后再从内往外。
从外到内进行事件传播,为事件捕获阶段,从内往外逐层进行传递,为事件的冒泡阶段。
 

4,button触发的p的click事件

 1 <!DOCTYPE html>
 2 <html lang="en">
 3   <head>
 4     <meta charset="UTF-8" />
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge" />
 7     <title>Document</title>
 8     <style>
 9       .main {
10         background-color: #e27;
11         padding: 2rem;
12       }
13       .mid {
14         background-color: #03f;
15         padding: 2rem;
16       }
17       p {
18         background-color: #300;
19         padding: 2rem;
20       }
21     </style>
22   </head>
23 
24   <body>
25     <div class="main">
26       <div class="mid">
27         <p onclick="pClickHandle(event)">
28           <button onclick="btnClickHandle(event)">按钮</button>
29         </p>
30       </div>
31     </div>
32   </body>
33   <script>
34     function btnClickHandle(e) {
35       console.log("按钮被点击了");
36       console.log(e.target);
37       console.log(e.currentTarget);
38       console.groupEnd();
39     }
40     function pClickHandle(e) {
41       console.log("p标签被点击了");
42       console.log(e.target);
43       console.log(e.currentTarget);
44       console.groupEnd();
45     }
46 
47   </script>
48 </html>

点击button ,触发点击事件,由内向外。

//target 表示触发事件的标签
//currentTarget 表示绑定事件的标签
p 标签内target是指触发的事件标签是button
currentTarget 表示绑定的p标签本身。
 

技术图片

 5,button触发的捕获阶段的事件

  

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      .main {
        background-color: #e27;
        padding: 2rem;
      }
      .mid {
        background-color: #03f;
        padding: 2rem;
      }
      p {
        background-color: #300;
        padding: 2rem;
      }
    </style>
  </head>
  <body>
    <div class="main">
      <div class="mid">
        <p onclick="pClickHandle(event)">
          <button onclick="btnClickHandle(event)">按钮</button>
        </p>
      </div>
    </div>
  </body>
  <script>
    const main = document.querySelector(".main");
    const mid = document.querySelector(".mid");
    const btn = document.querySelector("button");
    const p = document.querySelector("p");
    function btnClickHandle(e) {
      console.log("按钮被点击了");
      console.log(e.target);
      console.log(e.currentTarget);
      console.groupEnd();
    }
    function pClickHandle(e) {
      console.log("p标签被点击了");
      console.log(e.target);
      console.log(e.currentTarget);
      console.groupEnd();
    }
    //assEventListener接收三个参数
    //参数一,表示事件的类型
    //参数二,表示事件的处理函数
    //参数三,是否在捕获阶段进行触发,默认为false,此处改为true
    btn.addEventListener(
      "click",
      function(e) {
        console.log("按钮被点击了,在捕获阶段");
        console.log(e.target);
        console.log(e.currentTarget);
        console.groupEnd();
      },
      true
    );
    p.addEventListener(
      "click",
      function(e) {
        console.log("p被点击了,在捕获阶段");
        console.log(e.target);
        console.log(e.currentTarget);
        console.groupEnd();
      },
      true
    );
  </script>
</html>
 
点击button按钮,正常情况下应该是捕获阶段先执行的,但是如下图所示后执行的捕获阶段的事件
 
技术图片
 
原因是因为btn是事件源上的传播,事件源上的传播只跟添加的先后顺序有关系
//assEventListener接收三个参数
    //参数一,表示事件的类型
    //参数二,表示事件的处理函数
    //参数三,是否在捕获阶段进行触发,默认为false,此处改为true
    btn.addEventListener(  //btn 为事件源
      "click",
      function(e) {
        console.log("按钮被点击了,在捕获阶段");
        console.log(e.target);
        console.log(e.currentTarget);
        console.groupEnd();
      },
      true
    );

 

6,禁止事件传播

e.stopImmediatePropagation();//立即停止事件传播 , 停下来就不继续往后走了
e.stopPropagation();//停止事件传播,在我这个节点上停下来,然后从这个节点上往回走
 p.addEventListener(
      "click",
      function(e) {
        console.log("p被点击了,在捕获阶段");
        console.log(e.target);
        console.log(e.currentTarget);
        console.groupEnd();
        //  e.stopImmediatePropagation(); //立即停止事件传播
        e.stopPropagation(); //停止事件传播
      },
      true
    );

以上是个人对事件传播的理解,有什么不足的地方望大家指出。

 
 

JS中的事件传播流程

标签:listen   document   idt   两种   asc   窗口   bsp   元素   style   

原文地址:https://www.cnblogs.com/HannahFu/p/11291442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!