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>
3个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>
CSS

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

posted @ 2017-09-04 14:30  Mixier  阅读(385)  评论(0)    收藏  举报