JS中的事件传播流程

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
    );

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

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

时间: 2024-10-25 14:40:06

JS中的事件传播流程的相关文章

Js事件传播流程

Js事件传播流程 js事件传播流程主要分三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 在我们平常用的addEventListener方法中,一般只会用到两个参数,一个是需要绑定的事件,另一个是触发事件后要执行的函数,然而,addEventListener还可以传入第三个参数,第三个参数默认值是false,表示在事件冒泡阶段调用事件处理函数;如果参数为true,则表示在事件捕获阶段调用处理函数.   (1). 捕获阶段:事件从根节点流向目标节点,途中流经各个DOM节点,在各个节点上触发捕获

看懂此文,不再困惑于 JS 中的事件设计

看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一字节:爽. 作者:aitangyong 链接:blog.csdn.net/aitangyong/article/details/43231111 抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 javascript给DOM绑定事件

js中的事件,内置对象,正则表达式

[JS中的事件分类] 1.鼠标事件: click/dbclick/mouseover/mouseout/mousemove/mousedown/mouseup 2.键盘事件: keydown: 键盘按下去触发 keypress: 键盘按下并松开的瞬间触发 keyup: 键盘抬起时触发 [注意事项:(了解)] ① 执行顺序: keydown--keypress--keyup ② 长按时,会循环不断的执行keydown-keypress ③ 有keydown事件,不一定有keyup事件(事件触发过程

js中鼠标事件总结

js中鼠标事件主要有onclick,onmousedown,onmouseup,oncontextmenu,ondblclick,所有的这些事件都包含有一个事件对象event,当然在IE低版本下,event对象是挂在window底下的.这个我们另行讨论. 1.通过html添加事件 <input type="button" click="alert(1)"/> 2.通过DOM0级方式添加事件 <input type="button"

从零开始的JS生活(二)——BOM、DOM与JS中的事件

上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举起了火把--BOM简介 BOM(Browser Object Model) 是指浏览器对象模型,在JS中BOM是个不折不扣的花心大萝卜,因为它有很多个对象,其中代表浏览器窗口的Window对象是BOM的"正室".也就是最重要的,其他对象都是正室的下手.或者叫侧室也不足为过. 2.细数BOM

JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象

   前   言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学,经过初步的学习,会对这一门语言有了一定深入的了解,也会感受到这一门语言的强大之处.希望各位同学通过一定的学习,会得到等大的收获. 因为是最后一篇所以内容可能有点多,希望各位同学能够慢慢看,细细看,让我们一起学习,一起进步,一起感受JS的魅力. 一函数 函数的声明及调用 1.函数的声明格式: func

JS中的事件以及DOM 操作

[DOM树节点] DOM节点分为三大节点:元素节点,文本节点,属性节点. 文本节点,属性节点为元素节点的两个子节点通过getElment系列方法,可以去到元素节点 [查看节点] 1 document.getElementById("div1")  通过ID获取唯一的节点  多个同名ID只会取到第一个 2 getElmentsName   通过Name取到一个数组,包含1到多个节点   使用方式   通过循环,取到每一个节点  循环次数从0开始,<数组 length [查看和设置属

JS中的事件冒泡(Bubble)和事件捕获(capture)以及如何阻止事件的冒泡

对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrome,safari这类所谓的标准浏览器中,事件传播通常是有三个阶段的:事件捕获阶段,事 件目标阶段,事件冒泡阶段,这三者的执行的顺序是先捕获在冒泡.对于捕获阶段,这个很少 有用武之地,所以被人疏忽遗忘也在所难免了,不常用不代表它不存在,本着科学严谨的态度,我们有必要去看一下它的庐山真面目

DOM 以及JS中的事件

[DOM树节点] DOM节点分为三大节点:元素节点,文本节点,属性节点. 文本节点,属性节点为元素节点的两个子节点通过getElment系列方法,可以去到元素节点 [查看节点] 1 document.getElementById("div1")  通过ID获取唯一的节点  多个同名ID只会取到第一个 2 getElmentsName   通过Name取到一个数组,包含1到多个节点   使用方式   通过循环,取到每一个节点  循环次数从0开始,<数组 length [查看和设置属