dom事件不求甚解,色解事件捕获和冒泡
以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了

所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了,请在评论里指出
首先,在页面上方4个div标签,一个嵌套个用来测试捕获和冒泡,
因为捕获和冒泡的重点是过程,而不是起点和重点,所以我只在中间的两个div small和meddiv 上绑定了事件

基本的html代码如下
<div id="bigdiv" style="width: 800px; height: 800px;background-color: gold;float: left;margin: 10px 10px 10px 10px">
<span id="bigdiv_e">bigdiv</span>
<div id="Meddiv" style="width: 500px; height: 500px;background-color: #0000ff;float: left;margin: 10px 10px 10px 10px">
<span id="Meddiv_e">Meddiv</span>
<div id="small" style="width: 300px; height: 300px;background-color: silver;float: left;margin: 10px 10px 10px 10px">
<span id="small_e">small</span>
<div id="verysmall" style="width: 100px; height: 100px;background-color: saddlebrown;float: left;margin: 10px 10px 10px 10px">
<span id="verysmall_e">verysmall</span>
</div> </div>
</div>
</div>
基本的js如下
<script>
function geteventPhasetype(num){
var state="未知"
if(num==1)
{
state="捕获阶段";
}else if(num==2)
{
state="正常事件派发";
}else if(num==3)
{
state="起泡阶段";
}
return state+"eventPhase 为"+num;
} var Meddiv=document.getElementById("Meddiv");
Meddiv.addEventListener('click',function(e){
console.log("Meddiv 捕获注册的:target:"+ e.target.id+",阶段"+geteventPhasetype( e.eventPhase)+",currentTarget:"+ e.currentTarget.id);
},true);
Meddiv.addEventListener('click',function(e){
console.log("Meddiv 冒泡注册的:target:"+ e.target.id+",阶段"+ geteventPhasetype( e.eventPhase)+",currentTarget:"+ e.currentTarget.id);
},false);
var small=document.getElementById("small");
small.addEventListener('click',function(e){
console.log("small 捕获注册的:target:"+ e.target.id+",阶段"+geteventPhasetype( e.eventPhase)+",currentTarget:"+ e.currentTarget.id);
},true);
small.addEventListener('click',function(e){
console.log("small 冒泡注册的:target:"+ e.target.id+",阶段"+geteventPhasetype( e.eventPhase)+",currentTarget:"+ e.currentTarget.id);
},false); </script>
这些js分别完成了针对冒泡阶段和捕获阶段的事件监听,geteventPhasetype 根据事件的eventPhase 判断当前处理事件在状态
第一个实验,在黄色区域点击,
实验结果:console 没有任何输出,Meddiv,small没有输出,
第二个实验,在蓝色区域点击,
实验输出:Meddiv 捕获注册的:target:Meddiv,阶段正常事件派发eventPhase 为2,currentTarget:Meddiv
Meddiv 冒泡注册的:target:Meddiv,阶段正常事件派发eventPhase 为2,currentTarget:Meddiv
实验结果:1 里面的div没有捕获到事件
2 点击Meddiv时候,Meddiv事件的状态始终为eventPhase=2,事件处理阶段,捕获和冒泡注册的时间的事件都会执行
第三个实验:点击银色区域,
实验输出:Meddiv 捕获注册的:target:small,阶段捕获阶段eventPhase 为1,currentTarget:Meddiv
small 捕获注册的:target:small,阶段正常事件派发eventPhase 为2,currentTarget:small
mall 冒泡注册的:target:small,阶段正常事件派发eventPhase 为2,currentTarget:small
Meddiv 冒泡注册的:target:small,阶段起泡阶段eventPhase 为3,currentTarget:Meddiv
实验结果:点击 银色区域small 的时候,外面包裹的Meddiv,处于捕获阶段,执行捕获节点的方法
small 处于事件正常派发阶段,处理捕获和冒泡的执行的方法
外面包裹的Meddiv,处于冒泡阶段,执行冒泡的执行方法
另外 在处于正常派发阶段的时候,执行方法的顺序和注册顺序有关,例如颠倒了注册方法的顺序,执行结果如下
Meddiv 捕获注册的:target:small,阶段捕获阶段eventPhase 为1,currentTarget:Meddiv
mall 冒泡注册的:target:small,阶段正常事件派发eventPhase 为2,currentTarget:small
small 捕获注册的:target:small,阶段正常事件派发eventPhase 为2,currentTarget:small
Meddiv 冒泡注册的:target:small,阶段起泡阶段eventPhase 为3,currentTarget:Meddiv
第四个实验:点击最里面的紫色区域
实验输出:Meddiv 捕获注册的:target:verysmall,阶段捕获阶段eventPhase 为1,currentTarget:Meddiv
small 捕获注册的:target:verysmall,阶段捕获阶段eventPhase 为1,currentTarget:small
small 冒泡注册的:target:verysmall,阶段起泡阶段eventPhase 为3,currentTarget:small
Meddiv 冒泡注册的:target:verysmall,阶段起泡阶段eventPhase 为3,currentTarget:Meddiv
实验结果:Meddiv 和small先执行捕获对应的方法,然后执行冒泡对应的方法
实验猜想:事件捕获和事件冒泡那个性能高,那个最高效
事件捕获为从外向内,到达点击的元素后,就停止向下传播
事件冒泡为,事件在到达点击元素后,处理完事件,如果不阻止事件传播,事件就会向上冒泡,一直到最顶部
so 网页布局改如何布局,移动端争分夺秒的加载和寸土必争的内存改如何处理,答案是网页扁平化
要这样的结构布局

不要这样的结构布局

减少事件传播管卡,加速系统响应
以前很少在事件对应的方法执行时判断事件所处的状态,通过这次试验发现,如果使用原生的方法添加事件,
根据 eventPhase、 currentTarget、target组合判断是否应该执行方法,很重要的
dom事件不求甚解,色解事件捕获和冒泡的更多相关文章
- javascript的事件监听与捕获和冒泡
在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调来进行相关的操作. 而js中事件监听方法总共有三种,分别如下所示: element.addEventL ...
- JavaScript的事件监听、捕获和冒泡
在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调函数来进行相关的操作. 而JavaScript中事件监听的方法总共有三种,分别如下: element. ...
- DOM事件阶段以及事件捕获与事件冒泡先后执行顺序
平时浏览这么多技术文章,如过不去实践.深入弄透它,这个技术点很快就会在脑海里模糊.要加深印象,就得好好过一遍.重要的事情说三遍,重要的知识写一遍. 开发过程中我们都希望使用别人成熟的框架,因为站在巨人 ...
- 整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件
整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的 ...
- 事件流之事件冒泡与事件捕获<JavaScript高级程序设计>学习笔记
1.事件流 浏览器开发团队遇到一个很有意思问题:页面的那一部分会拥有特定的事件? 对于理解这个问题您可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其实不是一个圆,而是纸上 ...
- js中addEventListener第三个参数涉及到的事件捕获与冒泡
js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型, ...
- javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)
前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...
- js事件的捕获和冒泡阶段
讨论的主要是两个事件模型:IE事件模型与DOM事件模型 IE内核浏览器的事件模型是冒泡型事件(没有捕获事件过程),事件句柄的触发顺序是从ChildNode到ParentNode. <div id ...
- JavaScript和JQuery中的事件\委托链\事件冒泡\事件捕获,兼容所有浏览器
有做过北大青鸟培训讲师经验的我,如今在一家公司做技术部经理的职位,发现有很多程序员的基本功相当糟糕,在组织企业内部培训时讲解了一些案例,总结了一些经典代码,希望对自己和有需要的人提供一些帮助吧: Ja ...
随机推荐
- 深入理解SELinux SEAndroid
参考文章: 一. http://blog.csdn.net/innost/article/details/19299937 二. http://blog.csdn.net/innost/article ...
- VC++中字符串编码的转换
在以前VC++6.0中默认的字符集是多字节字符集(MBCS:Multi-Byte Character Set),而VS2005及以后默认的字符集是Unicode,这样导致以前在VC6.0中非常简单实用 ...
- Entity Framework Code First for SQL Compact
这篇博客将介绍EF Code First中如何使用SQL Compact.SQL Compact是微软推出的免费的关系型数据库,目前最新版本是SQL Compact 4.0.微软的开发工具VS 201 ...
- unity3D与网页的交互---做项目的一点总结
(来自博客园) 由于项目需要,要求用unity来展示三维场景,并在三维中能够方便的查询数据库等.一开始尝试在unity中直接连接数据库,当时连的xml,然而每次发布成网页后都会出现路径找不到等问题,所 ...
- C++ 简单的学生信息管理系统
// // main.cpp // 2013-7-17作业1 // // Created by 丁小未 on 13-7-17. // Copyright (c) 2013年 dingxiaowei. ...
- Codeforces Round #333 (Div. 1) D. Acyclic Organic Compounds trie树合并
D. Acyclic Organic Compounds You are given a tree T with n vertices (numbered 1 through n) and a l ...
- loj 1002(spfa变形)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25828 题意:求所有点到给定的目标顶点的路径上的权值的最大值的最小 ...
- c++ shared_ptr 使用注意事项. 2
1.抛弃临时对象,让所有的智能指针都有名字. 2.类向外传递 this 的 shared_ptr 让类继承 enable_shared_from_this. 然后返回 shared_from_ ...
- JSON详解以及可以把javabean转换成json串的json-lib应用
JSON 1. json是什么 它是js提供的一种数据交换格式! 2. json的语法 {}:是对象! 属性名必须使用双引号括起来!单引不行!!! 属性值:null,数值,字符串,数组:使用[]括起来 ...
- clone github的代码
终端执行:git clone 连接.git #不用sudo