事件冒泡事件捕获分别由微软网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。

<div id='aa' click='po'><p id='bb' click='on'>点击</p>
</div>

  上面两个点击事件如果点击的时候,到底谁会被先触发呢,为了解决这个问题微软和网景提出了两种几乎完全相反的概念。

事件冒泡

微软提出了名为事件冒泡(event bubbling)的事件流。事件冒泡可以形象地比喻为把一颗石头投入水中,泡泡会一直从水底冒出水面。也就是说,事件会从最内层的元素开始发生,一直向上传播,直到document对象。

因此在事件冒泡的概念下在p元素上发生click事件的顺序应该是p -> div -> body -> html -> document

事件捕获

网景提出另一种事件流名为事件捕获(event capturing)。与事件冒泡相反,事件会从最外层开始发生,直到最具体的元素。

因此在事件捕获的概念下在p元素上发生click事件的顺序应该是document -> html -> body -> div -> p

后来 w3c 采用折中的方式,平息了战火,制定了统一的标准——先捕获再冒泡。

冒泡的案例

<div id="s1">s1<div id="s2">s2</div>
</div>
<script>s1.addEventListener("click",function(e){console.log("s1 冒泡事件");},false);s2.addEventListener("click",function(e){console.log("s2 冒泡事件");},false);
</script>

  

捕获的案例

<div id="s1">s1<div id="s2">s2</div>
</div>
<script>s1.addEventListener("click",function(e){console.log("s1 捕获事件");},true);s2.addEventListener("click",function(e){console.log("s2 捕获事件");},true);
</script>

  当事件冒泡和捕获在一起出现的时候

<div id="s1">s1<div id="s2">s2</div>
</div>
<script>
s1.addEventListener("click",function(e){console.log("s1 冒泡事件");
},false);
s2.addEventListener("click",function(e){console.log("s2 冒泡事件");
},false);s1.addEventListener("click",function(e){console.log("s1 捕获事件");
},true);s2.addEventListener("click",function(e){console.log("s2 捕获事件");
},true);
</script>

  

  • 对于非被点击dom节点则先执行捕获在执行冒泡

  • 对于被点击的dom节点则是先执行先注册的事件,无论冒泡还是捕获

事件冒泡和捕获,衍生出事件委托,因为当你点击子元素的时候,实际上走的是父组件的事件

<ul id="list"><li>111</li><li>2222</li>
</ul>

  点击子元素的时候,由父元素去代为执行,能减少事件输出,代码的编写量

取消默认事件

w3c 的方法是 e.preventDefault(),IE 则是使用 e.returnValue = false;

取消默认事件,还可以用return来进行阻止

阻止冒泡的事件

w3c 的方法是 e.stopPropagation(),IE 则是使用 e.cancelBubble = true

IE9 之前的IE不支持 stopPropagation() 方法。相反,IE事件对象有一个 cancleBubble 属性,设置这个属性为 true 能阻止事件进一步传播。( IE8 及之前版本不支持事件传播的捕获阶段,所以冒泡是唯一待取消的事件传播。)

冒泡事件案例:

<div id='div' οnclick='alert("div");'>
<ul οnclick='alert("ul");'>
<li οnclick='alert("li");'>test</li>
</ul>
</div>

  正常情况下,li>ul>div,这就是正常的冒泡的事件

阻止冒泡的事件:

window.event? window.event.cancelBubble = true : e.stopPropagation();

  阻止冒泡事件,案例

<html><head><style>#a{width: 300px;height: 300px;background: pink;}#b{width: 200px;height: 200px;background: blue;}#c{width: 100px;height: 100px;background: yellow;}</style></head><body><div id="a"><div id="b"><div id="c"></div></div></div><script>var a = document.getElementById("a"),b = document.getElementById("b"),c = document.getElementById("c");c.addEventListener("click", function (event) {console.log("c1");event.stopImmediatePropagation();// 注意第三个参数没有传进 false , 因为默认传进来的是 false//,代表冒泡阶段调用,个人认为处于目标阶段也会调用的
            });c.addEventListener("click", function (event) {console.log("c2");}, true);b.addEventListener("click", function (event) {console.log("b");}, true);a.addEventListener("click", function (event) {console.log("a1");}, true);a.addEventListener("click", function (event) {console.log("a2")});a.addEventListener("click", function (event) {console.log("a3");event.stopImmediatePropagation();}, true);a.addEventListener("click", function (event) {console.log("a4");}, true);</script></body>
</html>

当时写博客的时候忘了写阻止冒泡的事件了,多谢老铁提醒!!!

转载于:https://www.cnblogs.com/yishifuping/p/10304087.html

js事件(事件冒泡与事件捕获)相关推荐

  1. js之捕捉冒泡和事件委托

     以下为转载内容 一.事件流(捕获,冒泡) 事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序 ...

  2. JS不支持冒泡的事件

    1.UI事件: loadunloadscrollresize 2.焦点事件 : blurfocus 3.鼠标事件: mouseleavemouseenter 冒泡的事件解释: 当事件发生后,这个事件就 ...

  3. javascript -- 事件--事件流-- 冒泡 --捕获

    javascript -- 事件 事件是js和用户操作交互的桥梁, JavaScript 有三种事件模型:内联模型.脚本模型和 DOM2 模型 内联模型 这种模型是最传统接单的一种处理事件的方法.在内 ...

  4. JavaScript之事件冒泡和事件捕获详细介绍

    怎样使用事件以及IE和DOM事件模型之间存在哪些主要差别,有需要的朋友可以参考一下 (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: ...

  5. javascript中的事件冒泡、事件捕获和事件执行顺序

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...

  6. 你真的理解事件绑定、事件冒泡和事件委托吗?

    一文了解Web API中的事件绑定.事件冒泡.事件委托 引言 正文 一.事件绑定 1.事件和事件绑定时什么? 2.事件是如何实现的? 二.事件冒泡 1.事件模型 2.事件模型解析 (1)捕获阶段 (2 ...

  7. Silverlight实用窍门系列:35.细解Silverlight冒泡路由事件和注册冒泡路由事件【附带实例源码】...

    Silverlight中的事件分为普通事件和冒泡路由事件,它并没有包括WPF中的隧道路由事件,在本章中将详细讲解冒泡路由事件和如何注册一个冒泡路由事件. 一.细解冒泡路由事件 冒泡路由事件可以比喻为: ...

  8. JS 事件冒泡和事件捕获

    原文:https://www.cnblogs.com/qq9694526/p/5653728.html JS 事件冒泡和事件捕获 本文中关于事件冒泡和事件捕获的描述和例子都是OK的,错就错在后面用jq ...

  9. JS中绑定事件顺序(事件冒泡与事件捕获区别)

    在JS中,绑定的事件默认的执行时间是在冒泡阶段执行,而非在捕获阶段(重要),这也是为什么当父类和子类都绑定了某个事件,会先调用子类绑定的事件,后调用父类的事件.直接看下面实例 <!Doctype ...

  10. 彻底弄懂JS的事件冒泡和事件捕获

    原文地址为: 彻底弄懂JS的事件冒泡和事件捕获 在学校,听老师讲解事件冒泡和事件捕获机制的时候跟听天书一样,只依稀记得IE使用的是事件冒泡,其他浏览器则是事件捕获.当时的我,把它当成IE浏览器兼容问题 ...

最新文章

  1. c++ 进程快照_如何在 Linux 中找出内存消耗最大的进程
  2. java 接口工程_Java工程师(15)抽象类与接口
  3. Nginx+Lua服务端合并静态文件
  4. LVS的简单示例(一)
  5. Protobuf 安装及 Python、C# 示例
  6. 蓝桥杯 基础练习 2n皇后
  7. Android基础夯实--你了解Handler有多少?
  8. 对break和continue的一些个人认知(称不上见解)
  9. (转)Linux中的screen命令使用
  10. 1. JavaScript Array 对象
  11. [React-Native]环境配置amp;HelloWorld
  12. fiddler抓包视频
  13. 在c语言中的变量分为三种类型,在C语言中的实型变量分为两种类型,它们是_______和__________ 答案:float double...
  14. 美团网2014校园招聘笔试题(长沙站)
  15. 翡翠手链的寓意是什么?要如何保养它才好!
  16. Asia/Shanghai与GMT-8的区别
  17. 【Linux】Linux基础命令及英文全称
  18. NewStarCTF 公开赛赛道 WEEK2 pwn 砍一刀
  19. 计算机中的cad是什么意思是,cad是什么意思 cad是什么软件
  20. 华硕主板设置RTC自动开机

热门文章

  1. centos新装系统后安装软件整理
  2. 分布式事务处理--消息发送一致性的异常流程处理
  3. 三十五、 rsync工具介绍、rsync常用选项、rsync通过ssh同步
  4. python 之简单聊聊类的只读和只写特性
  5. LinkedIn首席数据科学家谈数据分析
  6. 手把手教你搭建LyncServer2013之部署边缘服务器(七)
  7. 计算机网络基础(二)
  8. 我们的系统是否需要EJB3?
  9. 带通滤波器作用和用途_常见低通、高通、带通三种滤波器的工作原理
  10. 在Tomcat中部署web项目的三种方式