JS事件冒泡和事件捕获-学习笔记
一直没有搞懂这两个东西,今天看到vue的视频,又遇到了,还是决定自己来理一理。
一、事件冒泡
废话少说,先贴段代码,感受一下什么是事件冒泡。
HTML部分:

1 <div id="grandpa"> 2 grandpa 3 <div id="father"> 4 father 5 <div id="child"> 6 child 7 <button id="me">me</button> 8 </div> 9 </div> 10 </div>
CSS部分(只是为了看起来方便,没有实用性,看效果就好了):

1 <style> 2 #grandpa{ 3 padding-left: 5px; 4 width: 100px; 5 height: 100px; 6 background-color: #BDF5E6; 7 } 8 #father{ 9 padding-left: 5px; 10 width: 80px; 11 height: 80px; 12 background-color: #60F8CF; 13 } 14 #child{ 15 padding-left: 5px; 16 width: 60px; 17 height: 60px; 18 background-color: #05F8B6; 19 } 20 #me{ 21 background-color: #077262; 22 } 23 </style>
JS部分:
1 <script> 2 document.getElementById('grandpa').addEventListener('click',function (e) { 3 console.log('grandpa事件被触发'+'-'+e.target.id) 4 }) 5 document.getElementById('father').addEventListener('click',function (e) { 6 console.log('father事件被触发'+'-'+e.target.id) 7 }) 8 document.getElementById('child').addEventListener('click',function (e) { 9 console.log('child事件被触发'+'-'+e.target.id) 10 }) 11 document.getElementById('me').addEventListener('click',function (e) { 12 console.log('me事件被触发'+'-'+e.target.id) 13 }) 14 </script>
点击结果:
结论:事件的触发顺序me-child-me-grandpa,自内向外的,即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播。这就是事件冒泡。
注意:这里的事件对象(回调函数里的参数e),指向的是鼠标直接点击的元素的事件对象。那如何获取各自对象的id值呢?直接在回调函数里用this.id就好啦。
阻止冒泡:
Jquery的e.stopPropagation会阻止冒泡(直接写在回调函数里就OK了),意思就是到我为止,我的爹和祖宗的事件就不要触发了。
二、事件捕获
事件冒泡明白了。这里就上结论。
事件捕获是先由最上一级的节点先接收事件,然后向下传播到具体的节点。这和事件冒泡是相反的。
绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。
上JS代码:
1 <script> 2 document.getElementById('grandpa').addEventListener('click',function (e) { 3 console.log('grandpa事件被触发'+'-'+e.target.id) 4 },true) 5 document.getElementById('father').addEventListener('click',function (e) { 6 console.log('father事件被触发'+'-'+e.target.id) 7 },true) 8 document.getElementById('child').addEventListener('click',function (e) { 9 console.log('child事件被触发'+'-'+e.target.id) 10 },true) 11 document.getElementById('me').addEventListener('click',function (e) { 12 console.log('me事件被触发'+'-'+e.target.id) 13 },true) 14 </script>
结果:
结论:事件触发顺序grandpa-father-child-me,自外向内的。即先由最上一级的节点先接收事件,然后向下传播到具体的节点。
三、DOM事件流
"DOM2级事件”规定的事件流包含三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,然后是实际的目标接收到事件,最后阶段是冒泡阶段。以上面的HTML页面为例,单击<div>元素将按照下图触发事件:
感受一下:JS代码(我们将grandpa和child放在捕获阶段,father和me放在冒泡阶段):
<script> document.getElementById('grandpa').addEventListener('click',function (e) { console.log('grandpa事件被触发'+'-'+e.target.id) },true) document.getElementById('father').addEventListener('click',function (e) { console.log('father事件被触发'+'-'+e.target.id) },false) document.getElementById('child').addEventListener('click',function (e) { console.log('child事件被触发'+'-'+e.target.id) },true) document.getElementById('me').addEventListener('click',function (e) { console.log('me事件被触发'+'-'+e.target.id) },false) </script>
结果:
结果:先触发的是捕获阶段的事件,所以上诉结论成立。
<--学习笔记,如有错误欢迎指正。-->
参考:http://www.cnblogs.com/linxuehan/p/3623760.html