js的事件的冒泡与捕捉,简单来说就像个V型,从最高层body开始捕捉事件,然后一层一层往下开始捕捉,底层捕捉到事件后进行处理,然后再一层层冒泡传给父级,父级再传到它的父级,如果没有阻止冒泡,事件会一直传回给body,整个下来如下图所示:

下面的例子可以证明事件的冒泡与捕捉的过程:
在此例中我们用到一个js函数:
addEventListener(event,listener,userCapture)
其中:event:就是监听的事件 listener:即要执行监听的函数 userCapture: false的时候是冒泡, true表示是捕获。

1.事件捕获
A:
<!DOCTYPE html>
<html>
<head>
<title>bubble</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
#parent {
width: 200px;
height: 200px;
background-color: green;
}
</style>
</head>
<body>
<div id="parent">
parent
<button id="child">child</button>
</div>
<script>
var parent = document.getElementById("parent");
var child = document.getElementById("child");
document.body.addEventListener("click",function(e){
console.log("body-capture");
},true);
parent.addEventListener("click",function(e){
console.log("parent-capture");
},true);
child.addEventListener("click",function(e){
console.log("child-capture");
},true);
</script>
</body>
</html>
上面代码输出的结果是:
body-capture
parent-capture
child-capture
说明事件的捕获是从上级往下捕获的。

2.事件冒泡
B:
<!DOCTYPE html>
<html>
<head>
<title>bubble</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
#parent {
width: 200px;
height: 200px;
background-color: green;
}
</style>
</head>
<body>
<div id="parent">
parent
<button id="child">child</button>
</div>
<script>
var parent = document.getElementById("parent");
var child = document.getElementById("child");
document.body.addEventListener("click",function(e){
console.log("click-body");
},false);
parent.addEventListener("click",function(e){
console.log("click-parent");
},false);
child.addEventListener("click",function(e){
console.log("click-child");
},false);
</script>
</body>
</html>

输出结果:
click-child
click-parent
click-body
事件冒泡从下级往上级冒泡

将上面的代码整合起来:
C:
出<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
<title>bubble</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
#parent {
width: 200px;
height: 200px;
background-color: green;
}
</style>
</head>
<body>
<div id="parent">
parent
<button id="child">child</button>
</div>
<script>
var parent = document.getElementById("parent");
var child = document.getElementById("child");
document.body.addEventListener("click",function(e){
alert("click-body");
},false);
parent.addEventListener("click",function(e){
alert("click-parent");
},false);
child.addEventListener("click",function(e){
alert("click-child");
},false);
document.body.addEventListener("click",function(e){
alert("body-capture");
},true);
parent.addEventListener("click",function(e){
alert("parent-capture");
},true);
child.addEventListener("click",function(e){
alert("child-capture");
},true);
</script>
</body>
</html>
输结果:
body-capture
parent-capture
click-child
child-capture (为神么到child是先执行冒泡,再执行捕获,这点我还没搞懂)
click-parent
click-body
事件是先捕获后冒泡,如上面所说的V型

3.阻止冒泡/阻止捕获

阻止冒泡需要 stopPropogation()函数
上栗B处代码,如果要在child执行完之后,阻止像parent冒泡则只需要将:
child.addEventListener("click",function(e){
console.log("click-child");
},false);
改为:
child.addEventListener("click",function(e){
console.log("click-child");
e.stopPropagation();
},false);

此时输出的结果就是:
click-child

阻止捕获也是同样方法,用stopPropogation()函数

将上栗A中的代码:
document.body.addEventListener("click",function(e){
console.log("click-body");
},false);
改为:
document.body.addEventListener("click",function(e){
console.log("body-capture");
e.stopPropagation();
},true);
则输出的结果是:
body-capture
body的下级就不能捕捉事件,捕捉不到事件,自然也就不能冒泡了。

以上是我对事件的冒泡和捕捉的理解,没有考虑不同浏览器对其的支持,以及不同浏览器处理的差别问题。
如有错误,欢迎指出
如有问题,欢迎提问

转载于:https://www.cnblogs.com/ycherry/p/7238765.html

js事件冒泡与捕捉解析相关推荐

  1. JS 事件冒泡和事件捕获

    原文:https://www.cnblogs.com/qq9694526/p/5653728.html JS 事件冒泡和事件捕获 本文中关于事件冒泡和事件捕获的描述和例子都是OK的,错就错在后面用jq ...

  2. js事件冒泡和事件委托

    原文:js事件冒泡和事件委托 js事件冒泡 js所谓的事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行 html: <ul class="clearfix&quo ...

  3. js事件冒泡、阻止事件冒泡以及阻止默认行为

    大家好,我是IT修真院武汉分院web第17期的学员吴三水,一枚正直纯洁善良的web程序员. 今天给大家分享一下,修真院官网js(职业)任务四,深度思考中的知识点--js事件冒泡.阻止事件冒泡以及阻止默 ...

  4. JavaScript(js)事件冒泡、事件捕获、事件委托详解

    JavaScript(js)事件冒泡.事件捕获.事件委托详解 1.什么是事件 JavaScript和HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口发生的一些特定的交互瞬间.可以使用监听 ...

  5. 什么是js事件冒泡?

    什么是js事件冒泡? 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或事件返回true,那么这个事 ...

  6. JS——事件冒泡与阻止事件冒泡

    文章目录 前言 一.DOM事件流 1.什么是事件流呢? 2.事件流的两种方式 2.1 事件冒泡 2.2 事件捕获 2.3 DOM事件的3个阶段 二.事件对象 1.什么是事件对象 2.事件对象的使用 3 ...

  7. 关于JS 事件冒泡和onclick,click,on()事件触发顺序

    今天在给JQgrid中的标签添加click事件的时候,发现一个问题. JQgrid的table中,点击任何位置,都会勾选点击行的checkbox,而我希望在点击我的标签的时候,不要勾选checkbox ...

  8. JS事件冒泡机制和兼容性添加事件

    本篇文章主要来讲讲 事件的冒泡机制 和 添加事件的几种方法. 一. JS的时间传递顺序: 捕获阶段 -> 目标阶段 -> 冒泡阶段 捕获阶段是指从父层往子层找.比如 <body> ...

  9. click事件在什么时候出发_关于JS 事件冒泡和onclick,click,on()事件触发顺序

    今天在给JQgrid中的标签添加click事件的时候,发现一个问题. JQgrid的table中,点击任何位置,都会勾选点击行的checkbox,而我希望在点击我的标签的时候,不要勾选checkbox ...

最新文章

  1. Java - 错误: quot;java.lang.ArrayIndexOutOfBoundsException: length=1; index=1quot;
  2. python学习之路day05——cmd操作命令
  3. xss challenge 解题思路(1-3)
  4. LeetCode 1056. 易混淆数(哈希)
  5. Kubernetes-存活探针(liveness probe)(十六)
  6. OpenGL ES的性能范围(OpenGL ES2.0官方文档)
  7. 2021年中国车内娱乐和信息系统市场趋势报告、技术动态创新及2027年市场预测
  8. 【Luogu】【关卡2-3】排序(2017年10月) 【AK】
  9. Java核心技术卷II:高级特性
  10. java电影购票系统_Java Swing实现电影购票系统项目
  11. 蓝牙电话之PBAP同步电话簿协议分析
  12. spacy词性标注解释【dep、pos、tag】
  13. ECMAscript6 初涉摘抄笔记
  14. windows无法完成系统配置。若要尝试恢复配置,请重新启动计算机。出现此情况怎么处理,Win7封装Windows无法完成系统配置解决方案...
  15. 葛道辉,李洪升,张亮,等. 轻量级神经网络架构综述
  16. 在线购物系统 问题描述、词汇表、领域类图
  17. oracle expdp jobname,【EXPDP/IMPDP】数据泵 job_name参数的使用
  18. R 加权最小二乘 代码_如何用EXCEL的规划求解功能优化投资组合的阿尔法值(最小二乘估计法)?...
  19. 《软件方法》第8章 分析 之 分析类图(2)
  20. 07_Numpy渐变图片的生成

热门文章

  1. 【技术史】数据中台的前世今生
  2. linux 汇编 读取软盘,Linux下如何格式化软盘和读取软盘?
  3. 三招助你轻松搞定超Diao氛围
  4. mysql全文索引FULLTEXT的哈希与BTREE方法对比
  5. ubuntu服务器php7.2启用mysqli(不用reboot超简单)
  6. ORACLE11G自动维护任务简析
  7. 使用 Authid Current_User 为调用者授权
  8. Gralde 网络代理
  9. 关于vue项目的打包
  10. 存储过程系列之存储过程具体操作过程及sql数据库调用