我一直想搞清楚事件在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事件执行流程分析的更多相关文章

  1. 报时机器人的rasa shell执行流程分析

      本文以报时机器人为载体,介绍了报时机器人的对话能力范围.配置文件功能和训练和运行命令,重点介绍了rasa shell命令启动后的程序执行过程. 一.报时机器人项目结构 1.对话能力范围 (1)能够 ...

  2. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

    最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...

  3. ThinkPHP 框架执行流程分析

    总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...

  4. Spring 文件上传MultipartFile 执行流程分析

    在了解Spring 文件上传执行流程之前,我们必须知道两点: 1.Spring 文件上传是基于common-fileUpload 组件的,所以,文件上传必须引入此包 2.Spring 文件上传需要在X ...

  5. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  6. Hive SQL执行流程分析

    转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command ...

  7. spark-sql执行流程分析

    spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...

  8. Netty执行流程分析与重要组件介绍

    一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle  处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...

  9. 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...

随机推荐

  1. 学习笔记-- android动画简述

    android支持三种类型的动画: ·属性动画  一种补间动画,通过在目标对象的任何属性的两个值之间应用赠了变化,可以生成一种动画效果.这种动画可以用来生成各种效果,例如:改变视图的颜色.透明条.淡入 ...

  2. apache安全配置---禁止访问特定文件,防止日志、压缩包被下载

    指定禁止访问 某些后缀的文件 修改apache配置httpd.conf,在最后加上配置后,重启apache <Files ~ ".txt|.log|.zip|.gz|.sql" ...

  3. 数据分析:中国高校更名历史 Python

    上周领了新任务,做国内高校改名历史的统计,这个挺有意思,以下是我任务完成过程,和大家分享. 一. 数据收集 数据需求:目前已有高校校名,各高校改名历史记录 高校校名数据来源:尝试从高校排名网站(iPI ...

  4. 集合框架(JCF/Java Collection Framework)

    集合的特点:1.数据的类型可以不同2.集合长度可变3.空间不固定集合也是对象,用于检索,存储以及传输对象集合框架的组成Collection接口和Map接口 Collection是Set接口和List接 ...

  5. 每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒? php

    //根据题意设定初始变量值//然后 一个while循环去操作//每换得一个瓶子,换的那个减去要做相应的数目//然后喝了啤酒后, 各数量加1//直到不符合要求.跳出循环 1 class Beer{ pr ...

  6. jquery实现AJAX的4种方法

    当我们用javascript写ajax程序写得很“开心”的时候,突然有人告诉你有一种东西叫jquery,它会告诉你不直接和 HttpRequest是多么的快乐,同时你再也不需要再烦恼纠结的ajax乱码 ...

  7. 多模块打包后,扫描不到@controller和@service,实现 ADD DIRECTORY ENTRIES

    多模块打包后,扫描不到@controller和@service等Bean. 原因:打包时没有生成目录信息 解决办法: 1.在eclipse或者myeclipse 打包时 勾选 ADD DIRECTOR ...

  8. Beta版本发布说明

    发布地址 https://github.com/LongWerLingShi/DataObtainingAndHandling/tree/beta 版本开发背景 首先,应软件工程课程要求,我们小组针对 ...

  9. AFNetworking3.0 Https P12证书

    最近服务器由原来的ice中间件改为https.方便了和服务器交互时不用自己aes加密了. -之前服务器人员和我(IOS)都没有使用过https,所以https跑不通很难说是服务器没有配置好还是IOS这 ...

  10. 《C与指针》第十三章练习

    本章例程 13.1类型无关的链表查找 #include <stdio.h> #include "node.h" Node *search_list(Node *node ...