javascript事件执行流程分析
我一直想搞清楚事件在DOM中的传播方式,今天经高人指点终于明白一二。首先扒了一张图:

事件捕获过程:当我们点击TEXT时,首先是window->document->body->div->text.这个过程称为事件捕获,W3C浏览器的标准执行流程。
事件冒泡过程:text->div->body->document->window.这个过程称为事件冒泡。IE浏览器只支持冒泡,不支持捕获。W3C浏览器先执行捕获,后执行冒泡。
再来看看addEventLister()函数,第3个参数默认为false,表示事件以冒泡的方法传播,当为true时,表示以捕获的方法。

<div class="selector2">selector2<div class="selector1">selector1</div></div>
<script type="text/javascript">
window.onload=function(){
var selector2 = document.querySelector(".selector2"),
selector1 = document.querySelector(".selector1"); //第三个参数默认为false,以冒泡的方式
selector1.addEventListener("click",function(){
console.log("selector1");
})
selector2.addEventListener("click",function(){
console.log("selector2");
})
document.body.addEventListener("click",function(){
console.log("body click");
})
//点击selector1 输出selector1,selector2,body click
//点击selector2 输出selector2,body click
</script>
其中selector1,selector2都是以冒泡的方法传播事件,先执行自己的click,再执行parentNode的click.
//第三个参数默认为true,以捕获的方式
selector1.addEventListener("click",function(){
console.log("selector1");
})
selector2.addEventListener("click",function(){
console.log("selector2");
},true) document.body.addEventListener("click",function(){
console.log("body click");
},true)
//点击selector1 输出body click,selector2,selector1
//点击selector2 输出body click,selector2
其中selector2和body以捕获方式执行,当点击selector1时,最先是body捕获,然后是selector2捕获,最后才传递到selector1。
如果把selector1也以捕获方式,结果还是一样的,以为selector1中没有元素捕获不到子元素的事件。
//第三个参数默认为false,以冒泡的方式,想让谁不冒泡的话在他的事件里面加上stopPropagation
selector1.addEventListener("click",function(e){
var e=window.event || e;
e.stopPropagation();
e.cancelBubble=true; //IE冒泡
console.log("selector1");
})
selector2.addEventListener("click",function(e){
console.log("selector2");
})
//点击selector1输出selector1
//点击selector2输出selecttor2
阻止了事件传播selector1不能向上冒泡了,如果把selector2的方式改为捕获,则点击selector1时输出selector2,selector1。selector2能捕获到它内部的selector1的事件。
selector1.addEventListener("click",function(){
console.log("selector1");
})
selector2.addEventListener("click",function(e){
var e=window.event || e;
e.stopPropagation();
console.log("selector2");
},true)
//点击selector1和selector2都输出selector2
见证奇迹时刻到了,点击selector1和selector2都输出selector2。
当我点击selector1时
事件流程: body->selector2-XX->selector1->selector2->body。因为selector2的捕获断了,不能传递到selector1。
总结:子元素绑定事件,父元素是捕获,则先于子元素响应事件,父元素是冒泡,则后于子元素响应事件
javascript事件执行流程分析的更多相关文章
- 报时机器人的rasa shell执行流程分析
本文以报时机器人为载体,介绍了报时机器人的对话能力范围.配置文件功能和训练和运行命令,重点介绍了rasa shell命令启动后的程序执行过程. 一.报时机器人项目结构 1.对话能力范围 (1)能够 ...
- 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...
- ThinkPHP 框架执行流程分析
总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...
- Spring 文件上传MultipartFile 执行流程分析
在了解Spring 文件上传执行流程之前,我们必须知道两点: 1.Spring 文件上传是基于common-fileUpload 组件的,所以,文件上传必须引入此包 2.Spring 文件上传需要在X ...
- [转]两表join的multi update语句在MySQL中的执行流程分析
出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...
- Hive SQL执行流程分析
转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command ...
- spark-sql执行流程分析
spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...
- Netty执行流程分析与重要组件介绍
一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle 处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...
- 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...
随机推荐
- 多表关联 update
UPDATE t_invests INNER JOIN t_user_coupons ON t_invests.user_coupon_id = t_user_coupons.id SET t_inv ...
- CEPH经常出现slow request的排查解决
现象: 通过ceph -w日志经常发现有request blocked的问题(如果虚拟机系统跑在ceph上时,就会发现严重的卡顿现象) 排查: 1.通过dstat未发现有明显的瓶颈 (dstat -t ...
- 关于使用flexible.js自适应页面,发现文字很多时,字体会变大的问题的原因和解决方案
具体自己还没研究过 先把别人写的文章收藏一下 主要是webkit 有一个Font Boosting特性,当文字小到一定程度的时候会触发这个属性,放大字体来提升页面的阅读感 . http://www.3 ...
- js判断类型方法
在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null,Boolean, Number和String:复杂数据类型是Object,Object中 ...
- UVa 12118 检查员的难题(dfs+欧拉回路)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- linux apache 配置URL地址栏大小写不敏感配置
1.apache配置 解决如下:把mod_speling.so放到apache目录下的 lib中... 然后修改http.conf文件, 加入:LoadModule speling_module /u ...
- array_multisort 的详细使用方法
1.如果第一个数组有相同的元素,那么后面对应位置的元素位置如何排序呢,请看下列代码$a1=array("Dog","Dog","Cat"); ...
- php 上传大文件配置upload_max_filesize和post_max_size选项
php 上传大文件配置upload_max_filesize和post_max_size选项 (2014-04-29 14:42:11) 转载▼ 标签: php.ini upload _files[f ...
- 2017年1月4日-linux学习
老男孩Linux运维实战培训 1.EmEditor文本编辑工具,我用Notepad++也很好用 2.win32文本比较工具使用技巧,我用svn也很好用 3.安装vmware软件及新建配置虚拟机视频,已 ...
- TimeQuest 静态时序分析 基本概论
静态时序分析 基本概念 [转载] 1. 背景 静态时序分析的前提就是设计者先提出要求,然后时序分析工具才会根据特定的时序模型进行分析,给出正确是时序报告. 进行静态时序分析,主要目的就是为了提高 ...