当前位置:网站首页>JS事件流、事件冒泡、阻止冒泡、事件捕获(一看就懂)
JS事件流、事件冒泡、阻止冒泡、事件捕获(一看就懂)
2022-06-09 14:30:00 【别盯着我的名字看】
讲 事件冒泡 、阻止冒泡 和 事件捕获 之前先说说什么是事件流,这样会更容易明白
一、事件和事件流
1、什么是事件
事件是可以被 JavaScript 侦测到的行为。 鼠标点击、鼠标移动、鼠标滚动、按下键盘,浏览器窗口大小的改变,网页加载完成,关闭网页等等都会发生事件。
2、什么是事件流
事件流,描述的是页面中接受事件的顺序。
一个完整的JS事件流是从window开始,最后回到window的一个过程。
事件流被分为三个阶段(1~ 5)捕获过程、(5~ 6)事件触发过程、(6~ 10)冒泡过程。
二、事件冒泡
看了上面的那张图应该对事件冒泡有了大概的了解了吧。总结来说就是: 当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window。
如果它的父级元素也有某个事件函数,当执行完它的事件函数后,也就会执行它父级的事件函数。
- 用代码感受下一下什么是事件冒泡:
<div class="parents" id="parents">
<div class="child" id="child"></div>
</div>实例图:
<script>
var parents = document.getElementById("parents");
var child = document.getElementById("child");
document.onclick = function(e){
alert("你点击了屏幕任何区域");
};
document.body.onclick = function(e){
alert("你点击了body区域");
};
parents.onclick = function (e) {
alert("你点击了parents区域");
};
child.onclick = function (e) {
alert("你点击了child区域");
};
</script>- 当点击区域①的时候:会依次弹出
你点击了child区域、你点击了parents区域、你点击了body区域、你点击了屏幕任何区域这四个弹框。 - 当点击区域②的时候:会依次弹出
你点击了parents区域、你点击了body区域、你点击了屏幕任何区域这三个弹框。 - 当点击区域③的时候:会弹出
你点击了body区域、你点击了屏幕任何区域这两个弹框。 - 当点击区域④的时候:就只弹出
你点击了屏幕任何区域这一个弹框。
三、阻止冒泡
1、JS阻止事件冒泡
我们用 e.stopPropagation() 这个方法添加到某事件函数里的末尾,就可以做到阻止冒泡事件。但是IE8及以下不支持e.stopPropagation() 方法,所以就封装一个方法。
<script>
function stopPropagation(e) {
e = e || window.event;
if(e.stopPropagation) {
e.stopPropagation(); //W3C阻止冒泡方法
} else {
e.cancelBubble = true; //IE阻止冒泡方法
}
}
</script>在child(区域①)的点击事件函数最后添加 stopPropagation(e) 方法。
<script>
child.onclick = function (e) {
alert("你点击了child区域");
stopPropagation(e);
};
</script>- 再次点击区域①的时候就只弹出
你点击了child区域这一个弹框。
2、JQ阻止事件冒泡
jq阻止事件冒泡就简单了,直接在事件函数里面添加 return false; 就行了。
<script>
$("#parents").click(function () {
alert("你点击了parents区域")
});
$("#child").click(function () {
alert("你点击了child区域");
return false;
});
</script>四、事件捕获
讲事件捕获之前先了解下addEventListener()方法:
addEventListener()定义与用法
- document.addEventListener() 方法用于向文档添加事件句柄。
- 提示: 可以使用 document.removeEventListener() 方法来移除 addEventListener() 方法添加的 事件句柄。
- 提示:使用 element.addEventListener() 方法为指定元素添加事件句柄。
语法:
document.addEventListener(event, function, useCapture);参数值:
参数 | 描述 |
|---|---|
event | 必需。描述事件名称的字符串。 注意: 不要使用 “on” 前缀。例如,使用 “click” 来取代 “onclick”。 提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册。 |
function | 必需。描述了事件触发后执行的函数。 当事件触发时,事件对象会作为第一个参数传入函数。事件对象的类型取决于特定的事件。例如, “click” 事件属于 MouseEvent(鼠标事件) 对象。 |
useCapture | 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。 可能值: true - 事件句柄在捕获阶段执行 false - 默认。事件句柄在冒泡阶段执行 |
从上面的表格中,可以看到参数值useCapture,为true的时候,事件在捕获过程中就会执行。 用代码感受下:
<div class="div1" id="div1">
<div class="div2" id="div2"></div>
</div>
<script>
var div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
div1.addEventListener("click",function () {
alert("你点击了div1")
},false); //false 在冒泡阶段执行
div2.addEventListener("click",function () {
alert("你点击了div2")
},false);
</script>当点击子元素 div2 的时候,会先弹出
你点击了div2的弹框后,再弹出你点击了div1的弹框。
如果将div1的addEventListener方法中的最后的布尔参数值改成true,来看看什么效果:
<div class="div1" id="div1">
<div class="div2" id="div2"></div>
</div>
<script>
var div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
div1.addEventListener("click",function () {
alert("你点击了div1")
},true); //false 在捕获阶段执行
div2.addEventListener("click",function () {
alert("你点击了div2")
},false);
</script>当点击子元素 div2 的时候,会先弹出
你点击了div1的弹框后,再弹出你点击了div2的弹框。,和之前的顺序就不一样了。
边栏推荐
- 华为,这也太强了吧..
- 数据库中错误1062,报错
- Geoffrey Hinton's latest interview: within five years, we will crack the brain's operating mechanism, but not through back propagation
- 为什么 SQL 语句使用了索引,但却还是慢查询?
- QUIC会成为互联网传输的颠覆者吗?
- Hongmeng porting i.mx6ull (VI) kconfig_ GCC_ Mkefile
- [云原生]Kubernetes可视化界面WEBUI Kubernetes Dashboard
- 文档编辑器
- ECCV 2020 | star: pedestrian trajectory prediction model based on transformer (II)
- unity Dots的IComponent使用的列表踩的坑
猜你喜欢

文化和自然遗产日,任务空投来了

Rest API中PUT 与 PATCH 使用区别及幂等性分析

华为十大发明公布:高效加法网络、多目标博弈智能驾驶获奖

U.S. restrictions on sharing security vulnerabilities will throw stones at its own feet, and domestic systems will gain development opportunities

Meanings of 10 important concepts and charts in Data Science

喜报 | 旺链科技签约汨罗市文旅体产业项目,打造“链”上数字乡村

Hongmeng transplants the compiling system of i.mx6ull (VII) liteos-a
![[云原生]Kubernetes可视化界面WEBUI Kubernetes Dashboard](/img/25/9ec90f660b290823c36c1fe5a4c69e.jpg)
[云原生]Kubernetes可视化界面WEBUI Kubernetes Dashboard

Award winning research

Web3 的“中国特色”
随机推荐
管理全局变量(二)
2022年6月中国数据库排行榜:TiDB卷土重来摘桂冠,达梦蛰伏五月夺探花
鸿蒙移植i.mx6ull(五) 移植概述
3 个技巧来破解你可以立即使用的 Flutter 生产力!
高速缓冲存储器Cache地址映像与变换及相联目录表的设计
Halodoc使用 Apache Hudi 构建 Lakehouse的关键经验
期货开户去哪里开?网上开户安不安全?
The salary remains unchanged, only four days a week. The UK is trying out the world's largest "four-day working system"
[cloud lesson] application platform lesson 43 cloud lesson gives you a quick introduction to multi cloud high availability services
insert into select/update
@Enablefeignclients annotation source code analysis
Graphpad prism 9 for Mac
分布式限流之基于Sentinel实现的限流漫谈(一)-概述
497. 非重叠矩形中的随机点
U.S. restrictions on sharing security vulnerabilities will throw stones at its own feet, and domestic systems will gain development opportunities
Hongmeng porting i.mx6ull (12) root file system
Qt msvc编译器中文问题解决,中文乱码以及无法正常编译
国货彩妆,败走618
鸿蒙移植i.mx6ull(十一) 存储设备驱动程序(基于IMX6ULL)
GreatSQL如何做中国广受欢迎的开源数据库