W3C标准冒泡、捕获机制
(一) 捕获和冒泡如何相互影响
我们来做几个任务吧!
有一个前提,#parent为标签,#child为子标签,他们是嵌套关系支线任务1
//捕获模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent');
}, true);
//捕获模式
document.getElementById('child').addEventListener('click', function(e) {
console.log('child');
}, true);
结果:
1. parent
2. child

支线任务2
//捕获模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent');
}, true);
//冒泡模式
document.getElementById('child').addEventListener('click', function(e) {
console.log('child');
}, false);
结果:
1. parent
2. child

支线任务3
//冒泡模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent');
}, false);
//捕获模式
document.getElementById('child').addEventListener('click', function(e) {
console.log('child');
}, true);
结果:
1. child
2. parent

支线任务4
//冒泡模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent');
}, false);
//冒泡模式
document.getElementById('child').addEventListener('click', function(e) {
console.log('child');
}, false);
结果:
1. child
2. parent

规律

- 从上面的结果得出,父容器的机制确定,子容器的机制不定,结果是确定的,说明父容器影响传递;
- 支线任务1-4是点击在子容器上,以子容器作为研究对象;
- 如果父容器为捕获(true)机制,先触发本身事件,再到子容器;
- 如果父容器为冒泡(false)机制,先触发子容器事件,再到本身;结论1
- 在嵌套容器上点击时,点击对象是最外层容器;
- 捕获机制:本身作为第一个执行参考对象,从本身开始向下传递;
- 冒泡机制:从最底层开始向上传递,直至到达本身(二)stopPropagation方法,阻止了什么?
前提:如果有stopPropagation方法,均放在console方法后面;
有一个假设:
- 因为stopPropagation是在console后面执行,所以无论何种情况至少出现一个结果;
- 有4种策略(true + stopPropagation)、(false + stopPropagation)、(true)、(false),也就是说父容器和子容器的排序有16种;
- 因为假设1,所以结果应该(不确定)有4个分别是(parent、child)、(child、parent)、(parent)、(child);
我们带着这些假设来做任务。
支线任务5
//捕获模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent')
e.stopPropagation();
}, true);
//捕获模式
document.getElementById('child').addEventListener('click', function(e) {
console.log('child')
}, true);
结果:
1. parent
这个结果说明,stopPropagation方法会阻止传递,无法传达到子节点上。
所以stopPropagation不是传闻的阻止冒泡方法,而是阻止传递的方法;支线任务6
支线任务6
//冒泡模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent')
e.stopPropagation();
}, false);
//捕获模式
document.getElementById('child').addEventListener('click', function(e) {
console.log('child')
}, true);
结果:
1. child
2. parent
按照上面的知识储备,再次论证了结论1
支线任务7
//冒泡模式
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent');
}, false);
//捕获模式
document.getElementById('child').addEventListener('click', function(e) {
e.stopPropagation();
console.log('child');
}, true);
结果:
1. child
子容器触发了e.stopPropagation(),导致冒泡链断裂,不再向上冒泡,所以#parent没有被触发!
支线任务8
//捕获
document.getElementById('parent').addEventListener('click', function(e) {
console.log('parent');
}, true);
//冒泡
document.getElementById('child').addEventListener('click', function(e) {
console.log('child');
e.stopPropagation();
}, false);
结果:
1. parent
2. child
因为得到了假设2的所有结果,所以不再列举了,来总结一下!
规律

这里进行了[parent,child]、[child,parent]、[parent]、[child] 4种结果,但没有枚举,其余12种排序自己撸一遍,可以更深入了解事件机制背后的原理!
总结
- 通过click事件可以推论,事件的触发均从最外层触发(document、html);
- 事件的执行是先通过机制再通过回调执行;
- 捕获机制:本身作为第一个执行参考对象,从本身开始向下传递;
- 冒泡机制:从最底层开始向上传递,直至到达本身;
- stopPropagation方法不是大家说的阻止冒泡,而是阻止传递(捕获 + 冒泡);
转自:https://zhuanlan.zhihu.com/p/24159132
W3C标准冒泡、捕获机制的更多相关文章
- 前端基本知识(一):W3C标准&&冒泡事件,捕获事件,W3C DOM对象模型,对比分析
W3C标准是万维网联盟, 其他的可以参考万维网版本的更新内容 一.W3C标准 二.W3C DOM事件 三.冒泡事件 四.捕获事件 一.W3C标准 其实网页是由三分部组成:1.结构(structure) ...
- w3c标准 dom对象 事件冒泡和事件捕获
http://www.cnblogs.com/chengxs/p/6388779.html http://www.jb51.net/article/42492.htm W3C标准是什么? 1.表现(c ...
- react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)
第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制) 课程目标 深入理解和掌握事件的冒泡及捕获机制 理解react中的合成事件的本质 在react组件中合理的使用原生事件 ...
- 每日分享!~ JavaScript中面试基础--1,数组检测的方式 2.传统事件绑定和W3C标准绑定事件的区别~
javaScript 那些方式中检测数据类型 typeof typeof isNaN // 结果是function 检测数组的几种方式 instanceof arr instanceof Array( ...
- [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...
- python 错误捕获机制分析
python语言是编程中使用率在Top 3之内的语言.python语言以灵活与简单著称,那么越是灵活的语言越需要判断出错的功力. 简单示例 以下是一个简单的错误程序,被除数不可为0,那么看看该代码的执 ...
- Javascript的异常捕获机制
這個異常處理機制,之前也只是,但是沒有怎麼用過,用了一次后發現還可以, 和java,python的異常處理機制也很相似 Javascript的异常捕获机制 1.1 基本的try…catch语句 ES3 ...
- W3C标准
W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...
- 浅谈w3c标准
#浅谈w3c标准 ##w3c标准是什么 w3c标准包括多个方面,官方是从应用角度分的,相关的文档可以戳[这里](http://www.w3.org/standards/).如果从WEB技术角度,可以分 ...
随机推荐
- sysbench测试阿里云CPU
参考 https://wiki.mikejung.biz/Benchmarking 买了一个1核的ECS,测试一下CPU性能 第一次是只用1个thread去跑 [root@iZwz9fy718twfi ...
- c/c++排坑(3) -- c/c++中的switch语句
switch语句的简单介绍 一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. switch(expres ...
- DP——最长上升子序列(LIS)
DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...
- 面向对象:__getitem__、__setitem__、__delitem__
item系列 class Person(object): def __init__(self, name): self.name = name def __getitem__(self, item): ...
- 《hello-world》第八次团队作业:Alpha冲刺-Scrum Meeting 4
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 <hello--worl ...
- Navicat premium连接Oracle报ORA-28547错误
1:ORA-28547 原因:navicate Primium版本的OCi和本地数据库的OCI版本不一致. 解决方法: 1:把navicate Primium版本自带oci.dll替换本地Oracle ...
- 如何应对SHA-1加密算法升级为SHA-256
经过权威机构证实,sha1加密算法的不安全性越来越高,sha指纹造假成本越来越低,随即微软.谷歌等IT巨头相继发布弃用sha1加密算法声明,第三方认证机构自2016年1月1日起,将全面停止签发SHA1 ...
- 爬虫——response中获取的不带主域名的url的拼接
scrapy中response提取的没有主域名的url拼接 # 1.导入urllib的parse # 2.调用parse.urljoin()进行拼接,例子中response.url会自动提取出当前页面 ...
- [bzoj1103][POI2007]大都市meg_dfs序_树状数组
大都市meg bzoj-1103 POI-2007 题目大意:给定一颗n个点的树,m次操作.将一条路的边权更改成0:查询一个点到根节点的点权和.开始的时候所有边的边权都是1. 注释:$1\le n,m ...
- MyBatis 3实现时间段精确的查询(转)
效果如下: 说明: 时间范围的查询会存在以下问题: 1.如果单纯采用年月日的形式会出现缺少最后一点的数据,比如要查询2015-09-16到2015-09-17,那么2015-09-17 01:00:0 ...