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

<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' onclick='alert("div");'>
<ul onclick='alert("ul");'>
<li onclick='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>

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

最新文章

  1. sublime text nodejs set
  2. 关于LuCi
  3. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
  4. JS字符串截取
  5. 数据库中的DDL和DML语言
  6. Android 开源框架
  7. [Leetcode][Python]24: Swap Nodes in Pairs
  8. SQL server 2008无法连接Local服务器的解决办法
  9. 【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系
  10. 给工程师的 10 条哲理(浅薄者迷信运气,强者相信因果,软件复制成本为零,文凭不重要,AWS使得创业成本为零,每个手机都是口袋里的强大电脑)
  11. org.apache.commons.lang3.StringUtils类中isBlank和isEmpty方法的区别
  12. HtmlTestRunner无法生成HTML报告问题
  13. 2017-06-26(groupadd groupmod groupdel)
  14. 在Tomcat中配置连接池和数据源
  15. 【Spark篇】--Spark中的宽窄依赖和Stage的划分
  16. Java学习笔记之——LinkedList
  17. centos7卸载旧jdk安装新jdk1.8
  18. 《Java 多线程编程核心技术》- 笔记
  19. 500 OOPS: bad bool value in config file for: anon_world_readable_only Login failed.
  20. Java之动手动脑(三)

热门文章

  1. bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】
  2. spoj3105 MOD - Power Modulo Inverted(exbsgs)
  3. IT兄弟连 JavaWeb教程 EL表达式中的内置对象
  4. SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
  5. chmod 详解
  6. 证书重复冲突问题:Command /usr/bin/codesign failed with exit code 1
  7. scrapy的中间件Downloader Middleware实现User-Agent随机切换
  8. CF #541div2 F
  9. Serega and Fun Codeforces - 455D || queue
  10. MySQL之select简单使用