事件捕获和事件冒泡涉及到了事件的流程,我们先来看一个例子:
一、 添加事件监听:给 window 添加点击的监听事件,输出 “别点了,受不了了“ 
<script>
function say(){
console.log("别点了,受不了了!");
}
window.addEventListener("click", say ,false);
</script>
二、上面我们已经知道如何添加监听,下面看一个例子,然后分析事件的流程:
事件流程的简单描述:
当我们给一个元素添加监听的时候,例如点击事件;
首先这个事件进入的是捕获阶段,也就是从外层向内层探索,例如下面的三个div嵌套的例子,
先找到到一个div,然后查看有没有绑定的事件,如果有,那么就执行相应的处理函数,如果
没有相应的事件或者事件执行完成,那么继续向里面的第二个div探索,如果第二个div有绑定
的事件,那么执行,如果没有,或者事件执行完成,继续向第三个div探索;
目标阶段,假设我们点击的是第三个div,那么到达这个div然后执行相应的处理就是我们本来
应该做的事情, 也就是我们的目标;
冒泡阶段,假设我们的目标阶段执行完成,那么从第三个div依次到达第一个div,就是冒泡阶段,
这个阶段, 所做的事情就是和捕获阶段相反的,如图所示;

当然了,默认情况下,我们嵌套的三个div执行的是冒泡事件,当然了,我们也可以设置是表现为
捕获行为还是冒泡行为,下面通过代码实例来说明;
默认情况下是冒泡行为,我们先来看冒泡:
我们定义三个嵌套的div,然后分别给每个div设置 click 监听,分别弹出不同的内容;
效果图:

代码实现:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="newbean"/>
<title> 事件捕获和事件冒泡 </title>
<style type="text/css">
#a{width:400px; height:400px; background-color:#ccc; padding:50px;}
#b{width:200px; height:200px; background-color:pink; padding:50px;}
#c{width:80px; height:80px; background-color:greenyellow;padding:50px;}
</style>
</head>
<body>
<div id="a">我是第一个
<div id="b">我是第二个
<div id="c">
我是第三个
</div>
</div>
</div>
<script>
var a=document.getElementById("a");
var b=document.getElementById("b");
var c=document.getElementById("c");
a.addEventListener("click",function(){
alert("我是第一个");
});
b.addEventListener("click",function(){
alert("我是第二个");
});
c.addEventListener("click",function(){
alert("我是第三个");
});
</script>
</body>
</html>
结果:当我们点击第一个div时,弹出 “ 我是第一个 ”;
当我们点击第二个div时,先弹出“我是第二个”,再弹出“我是第一个”;
当我们点击第三个div时,先弹出 “我是第三个”,再弹出我是“第二个”,最后弹出“我是第一个”;
这个就是典型的时间冒泡;
我们再来看看捕获:
代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="newbean"/>
<title> 事件捕获和事件冒泡 </title>
<style type="text/css">
#a{width:400px; height:400px; background-color:#ccc; padding:50px;}
#b{width:200px; height:200px; background-color:pink; padding:50px;}
#c{width:80px; height:80px; background-color:greenyellow;padding:50px;}
</style>
</head>
<body>
<div id="a">我是第一个
<div id="b">我是第二个
<div id="c">
我是第三个
</div>
</div>
</div>
<script>
var a=document.getElementById("a");
var b=document.getElementById("b");
var c=document.getElementById("c");
a.addEventListener("click",function(){
alert("我是第一个");
},true);
b.addEventListener("click",function(){
alert("我是第二个");
},true);
c.addEventListener("click",function(){
alert("我是第三个");
},true);
</script>
</body>
</html>
结果:当我们点击第一个div时,弹出 “ 我是第一个 ”;
当我们点击第二个div时,先弹出“我是第一个”,再弹出“我是第二个”;
当我们点击第三个div时,先弹出 “我是第一个”,再弹出我是“第二个”,最后弹出“我是第三个”;
这个就是捕获行为;
和冒泡的区别就是我们加了一个参数:
obj.addEventListener("click",function,true);
这里的第三个参数如果不写,那么就是默认的冒泡行为;如果写上false,那么还是冒泡行为;
但是如果写上true,那么就是捕获行为;