(一) 捕获和冒泡如何相互影响

我们来做几个任务吧!

有一个前提,#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是点击在子容器上,以子容器作为研究对象;
      1. 如果父容器为捕获(true)机制,先触发本身事件,再到子容器;
      2. 如果父容器为冒泡(false)机制,先触发子容器事件,再到本身;结论1
  • 在嵌套容器上点击时,点击对象是最外层容器;
  • 捕获机制:本身作为第一个执行参考对象,从本身开始向下传递;
  • 冒泡机制:从最底层开始向上传递,直至到达本身(二)stopPropagation方法,阻止了什么?

前提:如果有stopPropagation方法,均放在console方法后面;

有一个假设:

  1. 因为stopPropagation是在console后面执行,所以无论何种情况至少出现一个结果;
  2. 有4种策略(true + stopPropagation)、(false + stopPropagation)、(true)、(false),也就是说父容器和子容器的排序有16种;
  3. 因为假设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种排序自己撸一遍,可以更深入了解事件机制背后的原理!

总结

    1. 通过click事件可以推论,事件的触发均从最外层触发(document、html);
    2. 事件的执行是先通过机制再通过回调执行;
    3. 捕获机制:本身作为第一个执行参考对象,从本身开始向下传递;
    4. 冒泡机制:从最底层开始向上传递,直至到达本身;
    5. stopPropagation方法不是大家说的阻止冒泡,而是阻止传递(捕获 + 冒泡);

转自:https://zhuanlan.zhihu.com/p/24159132

W3C标准冒泡、捕获机制的更多相关文章

  1. 前端基本知识(一):W3C标准&&冒泡事件,捕获事件,W3C DOM对象模型,对比分析

    W3C标准是万维网联盟, 其他的可以参考万维网版本的更新内容 一.W3C标准 二.W3C DOM事件 三.冒泡事件 四.捕获事件 一.W3C标准 其实网页是由三分部组成:1.结构(structure) ...

  2. w3c标准 dom对象 事件冒泡和事件捕获

    http://www.cnblogs.com/chengxs/p/6388779.html http://www.jb51.net/article/42492.htm W3C标准是什么? 1.表现(c ...

  3. react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)

    第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制) 课程目标 深入理解和掌握事件的冒泡及捕获机制 理解react中的合成事件的本质 在react组件中合理的使用原生事件 ...

  4. 每日分享!~ JavaScript中面试基础--1,数组检测的方式 2.传统事件绑定和W3C标准绑定事件的区别~

    javaScript 那些方式中检测数据类型 typeof typeof isNaN // 结果是function 检测数组的几种方式 instanceof arr instanceof Array( ...

  5. [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流

    面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...

  6. python 错误捕获机制分析

    python语言是编程中使用率在Top 3之内的语言.python语言以灵活与简单著称,那么越是灵活的语言越需要判断出错的功力. 简单示例 以下是一个简单的错误程序,被除数不可为0,那么看看该代码的执 ...

  7. Javascript的异常捕获机制

    這個異常處理機制,之前也只是,但是沒有怎麼用過,用了一次后發現還可以, 和java,python的異常處理機制也很相似 Javascript的异常捕获机制 1.1 基本的try…catch语句 ES3 ...

  8. W3C标准

    W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...

  9. 浅谈w3c标准

    #浅谈w3c标准 ##w3c标准是什么 w3c标准包括多个方面,官方是从应用角度分的,相关的文档可以戳[这里](http://www.w3.org/standards/).如果从WEB技术角度,可以分 ...

随机推荐

  1. sysbench测试阿里云CPU

    参考 https://wiki.mikejung.biz/Benchmarking 买了一个1核的ECS,测试一下CPU性能 第一次是只用1个thread去跑 [root@iZwz9fy718twfi ...

  2. c/c++排坑(3) -- c/c++中的switch语句

    switch语句的简单介绍 一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. switch(expres ...

  3. DP——最长上升子序列(LIS)

    DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...

  4. 面向对象:__getitem__、__setitem__、__delitem__

    item系列 class Person(object): def __init__(self, name): self.name = name def __getitem__(self, item): ...

  5. 《hello-world》第八次团队作业:Alpha冲刺-Scrum Meeting 4

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 <hello--worl ...

  6. Navicat premium连接Oracle报ORA-28547错误

    1:ORA-28547 原因:navicate Primium版本的OCi和本地数据库的OCI版本不一致. 解决方法: 1:把navicate Primium版本自带oci.dll替换本地Oracle ...

  7. 如何应对SHA-1加密算法升级为SHA-256

    经过权威机构证实,sha1加密算法的不安全性越来越高,sha指纹造假成本越来越低,随即微软.谷歌等IT巨头相继发布弃用sha1加密算法声明,第三方认证机构自2016年1月1日起,将全面停止签发SHA1 ...

  8. 爬虫——response中获取的不带主域名的url的拼接

    scrapy中response提取的没有主域名的url拼接 # 1.导入urllib的parse # 2.调用parse.urljoin()进行拼接,例子中response.url会自动提取出当前页面 ...

  9. [bzoj1103][POI2007]大都市meg_dfs序_树状数组

    大都市meg bzoj-1103 POI-2007 题目大意:给定一颗n个点的树,m次操作.将一条路的边权更改成0:查询一个点到根节点的点权和.开始的时候所有边的边权都是1. 注释:$1\le n,m ...

  10. MyBatis 3实现时间段精确的查询(转)

    效果如下: 说明: 时间范围的查询会存在以下问题: 1.如果单纯采用年月日的形式会出现缺少最后一点的数据,比如要查询2015-09-16到2015-09-17,那么2015-09-17 01:00:0 ...