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树的最上层 捕获 ...
随机推荐
- Ubuntu——关于以root权限操作和启用root账户的讨论
概括性的说,在Ubuntu下面,推荐用户加入到sudo之后,使用命令: sudo -i 来以管理员权限进行操作. 而不推荐用户直接登录root用户. 具体内参考:https://help.ubuntu ...
- koa 基础(二十四)封装 DB 库 --- 新增数据、更新数据、删除数据
1.根目录/module/db.js /** * DB库 */ var MongoClient = require('mongodb').MongoClient; var Config = requi ...
- ThinkPhp中验证码不显示和配置项的问题解决方法
1.验证码不显示在调用验证码之前加上 ob_clean();像这样: public function verify(){ ob_clean(); $verify = new \Think\Verify ...
- MySQL 插件之 连接控制插件(Connection-Control)
目录 插件介绍 插件安装 插件配置 插件介绍 MySQL 5.7.17 以后提供了Connection-Control插件用来控制客户端在登录操作连续失败一定次数后的响应的延迟.该插件可有效的防止客户 ...
- LC 431. Encode N-ary Tree to Binary Tree 【lock,hard】
Design an algorithm to encode an N-ary tree into a binary tree and decode the binary tree to get the ...
- router 配置按需加载对应的组件,配置active
const routes = [ { path: '/', component: App, children: [ {path: '/index/:type', name: 'index', comp ...
- flutter showModalBottomSheet max height
static void showBuyServiceDialog(BuildContext context) { showModalBottomSheet( context: context, isS ...
- Unity和Mef的比较
1:Mef和Untiy都支持依赖注入 2:Mef支持插件的机制 3:Mef在写法上更简单灵活 4:Mef在宏观上比Unity更加庞大 5:Mef不支持Aop的切入拦截,Unity支持
- [Python]机器学习:Tensorflow实现线性回归
源码 #> tutorial:https://www.cnblogs.com/xianhan/p/9090426.html # 步骤一:构建模型 # 1.TensorFlow 中的线性模型 ## ...
- Java多线程(2):线程加入/join()
线程加入 join()方法,等待其他线程终止.在当前线程(主线程)中调用另一个线程(子线程)的join()方法,则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态. 也就是主 ...