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

我们来做几个任务吧!

有一个前提,#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. 【GC】

    using 语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以 try-finnaly 来实现,因为嵌套的 using 语句可能存在隐藏的 Bug.内层 using 块引发异常时,将不能 ...

  2. c++ map: 使用struct或者数组做value

    Notice 如果是program中有两个map对象,可能你需要两个map iterator,但是注意两个iter object不能命名一样,可以分别为iter1, iter2 Example #in ...

  3. [SQL Service] 时间处理:获取今天的00:00:00/获取今天的23:59:59

    获取今天的00:00:00 SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)) 获取今天的23:59:59 1.SELECT DAT ...

  4. java web 基本属性

    page指令 属性 描述 默认值 language 指定JSP页面使用的脚本语言 java import contenType include指令 taglib注释 <!--我是html注释-- ...

  5. 【codeforces 514D】R2D2 and Droid Army

    [题目链接]:http://codeforces.com/contest/514/problem/D [题意] 给你每个机器人的m种属性p1..pm 然后r2d2每次可以选择m种属性中的一种,进行一次 ...

  6. NYIST 760 See LCS again

    See LCS again时间限制:1000 ms | 内存限制:65535 KB难度:3 描述There are A, B two sequences, the number of elements ...

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

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

  8. Mac下查看文件编码方式

    一句话:file -I {filename}

  9. iOS: 两句话给UILabel添加下划线

    1. 将UILabel控件的Text属性设为Attributed 2. 在viewDidLoad方法中添加如下语句: NSDictionary *underlineAttribute = @{NSUn ...

  10. 我要抓狂了。。又回到了几天不能A一道题的时候

    poj1556我不做了.你做做把...我已经要game over了