JS中的事件传播流程

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

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

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

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

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

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

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

3,事件传播

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

4,button触发的p的click事件

 <!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>
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();
} </script>
</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中的事件传播流程的更多相关文章

  1. js中防止事件传播的方法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. js里事件传播流程

    Javascript与HTML之间的交互是通过事件实现的. 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 可以使用侦听器来预定事件,以便事件发生时执行相应代码. 事件流 JS事件流最早要从I ...

  3. 细说javascripe事件传播流程

    当我们使用js时,经常会遇到事件传播流程的问题,下面我说一下我的观点. 在js触发某个事件时会相应生成一个事件对象,而这个事件对象则会根据DOM事件流的方向进传递,而传递的顺序如下图所示: 事件对象会 ...

  4. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

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

    看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...

  6. JS 中的事件设计

    看懂此文,不再困惑于 JS 中的事件设计 原文出处: aitangyong    抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 ...

  7. js中的事件委托(事件代理)详解

    本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...

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

    对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefo ...

  9. js中冒泡事件和捕获事件

    js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获 ...

随机推荐

  1. Ubuntu——配置JDK

    在Ubuntu下配置JDK环境 检查是否已经安装了JDK,执行以下命令: java -v 如果出现以下内容则说明没有安装: 程序 'java' 已包含在下列软件包中: * default-jre * ...

  2. ssh不输入密码

    要通过跳转机器远程其他的机器 不方便使用秘钥 每次都要输入密码也很烦 使用sshpass可以复制一行命令就直接登录了 我的跳板机是Centos7安装sshpass很简单 直接如下搞定 yum inst ...

  3. VI快捷键速记

    enjoy :P

  4. 微信小程序之阻止冒泡事件

    众所周知,在微信小程序给标签绑定点击方法大家都会想到 "bindtap" 但是在页面中会遇到 点击 会冒泡而触发其他元素的时间发生 那么怎么办呢 就把引发冒泡事件的始作俑者的 bi ...

  5. [转]spring的filter中targetFilterLifecycle作用

    在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理. 配置分为两种A和B. A:普通配置 在web.xml中增加如下内容:<filter& ...

  6. Struts数据回显和模型驱动

    prams拦截器,可以把请求数据自动填充的action的属性中 举例1: JSP <input type=text name=userName /> <input type=text ...

  7. 阶段3 3.SpringMVC·_06.异常处理及拦截器_7 SpringMVC拦截器之拦截器接口方法演示

    返回值改成false 就是不放行 没有方形,控制台只有一个输出 转发到error页面 新建error.jsp页面 控制台只有拦截器的输出.controller根本就没有执行 把代码改回来 重写第二个方 ...

  8. JavaScript高程第三版笔记-面向对象编程

    之前有篇博客曾提到过一点js的面向对象编程:js面向对象编程. 这里就结合js高程详细剖析一下javascript的面向对象编程. 前序: 1⃣️Object.defineProperty() var ...

  9. 121. 买卖股票的最佳时机( Best Time to Buy and Sell Stock)

    题目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 解题思路一:暴力求解法 根据题目我们可以知道,我们知道最大 ...

  10. 把CSV文件中的labels标签提取为json文件

    需求: validationImages.csv文件是存储验证集数据名称和类别信息(labels)的文件, 要生成一个label和类别名一一对应且正序排列的json文件,代码如下: labels_di ...