JS中的事件传播流程
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 ,触发点击事件,由内向外。

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>

//assEventListener接收三个参数
//参数一,表示事件的类型
//参数二,表示事件的处理函数
//参数三,是否在捕获阶段进行触发,默认为false,此处改为true
btn.addEventListener( //btn 为事件源
"click",
function(e) {
console.log("按钮被点击了,在捕获阶段");
console.log(e.target);
console.log(e.currentTarget);
console.groupEnd();
},
true
);
6,禁止事件传播
p.addEventListener(
"click",
function(e) {
console.log("p被点击了,在捕获阶段");
console.log(e.target);
console.log(e.currentTarget);
console.groupEnd();
// e.stopImmediatePropagation(); //立即停止事件传播
e.stopPropagation(); //停止事件传播
},
true
);
以上是个人对事件传播的理解,有什么不足的地方望大家指出。
JS中的事件传播流程的更多相关文章
- js中防止事件传播的方法
		
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
 - js里事件传播流程
		
Javascript与HTML之间的交互是通过事件实现的. 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 可以使用侦听器来预定事件,以便事件发生时执行相应代码. 事件流 JS事件流最早要从I ...
 - 细说javascripe事件传播流程
		
当我们使用js时,经常会遇到事件传播流程的问题,下面我说一下我的观点. 在js触发某个事件时会相应生成一个事件对象,而这个事件对象则会根据DOM事件流的方向进传递,而传递的顺序如下图所示: 事件对象会 ...
 - 怎么理解js中的事件委托
		
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
 - 看懂此文,不再困惑于 JS 中的事件设计
		
看懂此文,不再困惑于 JS 中的事件设计 今天刚在关注的微信公众号看到的文章,关于JS事件的,写的很详细也很容易理解,相关的知识点都有总结到,看完就有种很舒畅的感觉,该串起来的知识点都串起来了.反正一 ...
 - JS 中的事件设计
		
看懂此文,不再困惑于 JS 中的事件设计 原文出处: aitangyong 抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 ...
 - js中的事件委托(事件代理)详解
		
本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...
 - JS中的事件冒泡(Bubble)和事件捕获(capture)以及如何阻止事件的冒泡
		
对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefo ...
 - js中冒泡事件和捕获事件
		
js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获 ...
 
随机推荐
- RN中webview的一些思考
			
刚开始只是对接一下RN,h5部分,嵌套在RN里的webview里需要隐藏一些原生的按钮,遇到很多沟通上的问题,本来没使用RN之前,也是嵌套在webview里,也没什么问题,突然RN嵌套就有问题了,对方 ...
 - openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)
			
待解决:图形中当改变分组时,图例不正确 存储比率计算时,分组合计不正确 wizard:过滤条件向导,用于输入过滤条件 wizard/sale_chart.py # -*- cod ...
 - Carousel 走马灯
			
在有限空间内,循环播放同一类型的图片.文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯.幻灯片的内容是任意的,需要放在e ...
 - html 网页源码解析:bs4中BeautifulSoup
			
from bs4 import BeautifulSoup result=requests.request("get","http://www.baidu.com&quo ...
 - [zookeeper]依赖jar的问题
			
zookeeper是依赖以下三个jar包 log4j-1.2.17.jar slf4j-api-1.7.25.jar slf4j-log4j12-1.7.18.jar 否则会报异常:java.lang ...
 - makeObjectsPerformSelector的使用
			
NSArray 类定义的方法: makeObjectsPerformSelector:这是数组用的方法,类似于for循环. makeObjectsPerformSelector:@selector(m ...
 - VS显示代码行号
			
工具>文本编辑器>常规 如图勾选行号选项,点击确定即可显示行号. 如果没有行号的选项,则需先勾选下图中左下角的‘’显示所有设置选‘’‘项.
 - Python内置函数Object
			
英文文档 class object Return a new featureless object. object is a base for all classes. It has the meth ...
 - 什么是数据传输服务DTS
			
数据传输服务(Data Transmission Service) DTS支持关系型数据库.NoSQL.大数据(OLAP)等数据源间的数据传输. 它是一种集数据迁移.数据订阅及数据实时同步于一体的数据 ...
 - 【转】在C#中使用Json.Net进行序列化和反序列化及定制化
			
作者:Minotauros 原文地址:在C#中使用Json.Net进行序列化和反序列化及定制化 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态, ...