target
在事件流的目標階段;
currentTarget
在事件流的捕獲,目標及冒泡階段。只有當事件流處在目標階段的時候,兩個的指向才是一樣的, 而當處於捕獲和冒泡階段的時候,
target
指向被單擊的物件
currentTarget
指向當前事件活動的物件(一般為父級)。
冒泡和捕獲
當點選頁面的一個元素的時候,事件會從這個元素的祖先元素逐層傳遞下來,這個過程成為事件捕獲
;當事件傳遞到這個元素之後,又會把事件逐成傳遞回去,直到根元素為止,這個階段是事件的冒泡階段
。
事件捕獲
事件冒泡
我們為一個元素繫結一個點選事件的時候,可以指定是要在捕獲階段繫結或者換在冒泡階段繫結。 當addEventListener
的第三個引數為true
的時候,代表是在捕獲階段繫結,當第三個引數為false
或者為空的時候,代表在冒泡階段繫結。
知道事件有這麼一個穿透的過程之後,結合下面的例子,就可以很好來理解event.target
和event.currentTarget
:
<body>
<div id="a">
<div id="b">
<div id="c">
<div id="d"></div>
</div>
</div>
</div>
<script>
document.getElementById('a').addEventListener('click', function ( e ) {
console.log('target:' + e.target.id + '¤tTarget:' + e.currentTarget.id);
});
document.getElementById('b').addEventListener('click', function ( e ) {
console.log('target:' + e.target.id + '¤tTarget:' + e.currentTarget.id);
});
document.getElementById('c').addEventListener('click', function ( e ) {
console.log('target:' + e.target.id + '¤tTarget:' + e.currentTarget.id);
});
document.getElementById('d').addEventListener('click', function ( e ) {
console.log('target:' + e.target.id + '¤tTarget:' + e.currentTarget.id);
});
</script>
</body>
複製程式碼
處於冒泡階段
//點選d元素的時候;
target:d¤tTarget:d // d觸發
target:d¤tTarget:c // c觸發
target:d¤tTarget:b // b觸發
target:d¤tTarget:a // a觸發
複製程式碼
從輸出中我們可以看到,event.target
指向引起觸發事件的元素,而event.currentTarget
則是事件繫結的元素,只有被點選的那個目標元素的event.target
才會等於event.currentTarget
。
將上述<script>標籤裡的事件繫結的第三個引數設定為true
時,事件處於捕獲階段,然後還是點選最裡層的元素d,這時event.target
還依舊會指向d,因為那是引起事件觸發的元素,因為event.currentTaget
指向事件繫結的元素,所以在捕獲階段,最先來到的元素是a,然後是b,接著是c,最後是d。所以輸出的內容如下:
處於捕獲階段
target:d¤tTarget:a // a觸發
target:d¤tTarget:b // b觸發
target:d¤tTarget:c // c觸發
target:d¤tTarget:d // d觸發
複製程式碼