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技术角度,可以分 ...
 
随机推荐
- Keil-MDK编译完成后代码大小
			
Code 代表执行的代码,程序中所有的函数都位于此处. RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处. RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局 ...
 - 【模板】Link-Cut Tree
			
#include<cstdio> #include<algorithm> #define N 500010 #define rg register #define ls (c[ ...
 - Spring整合Junit框架进行单元测试Demo
			
一.开发环境 eclipse版本:4.6.1 maven版本:3.3.3 junit版本:4.12 spring版本:4.1.5.RELEASE JDK版本:1.8.0_111 二.项目结构 图 三. ...
 - CodeForces - 205B - Little Elephant and Sorting
			
先上题目: Little Elephant and Sorting time limit per test 1 second memory limit per test 256 megabytes i ...
 - 浅析gcc、arm-linux-gcc和arm-elf-gcc关系
			
浅析gcc.arm-linux-gcc和arm-elf-gcc关系 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是 ...
 - Hadoop2.2.0 注意事项
			
1.启动前必须把防火墙关了,要不然会导致nodemanager启动不了. 关闭防火墙:service iptables stop 永久关闭(重启后默认关闭):chkconfig iptables of ...
 - N - 贪心
			
Have you ever heard the story of Blue.Mary, the great civil engineer? Unlike Mr. Wolowitz, Dr. Blue. ...
 - 洛谷——P1031 均分纸牌
			
https://www.luogu.org/problem/show?pid=1031#sub 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以 ...
 - memcached集群
			
借鉴:http://www.cnblogs.com/happyday56/p/3461113.html 首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Memcach ...
 - HDU 4258(Covered Walkway-斜率优化)
			
Covered Walkway Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...