定義
以下是紅寶書的描述
屬性/方法 | 類型 | 讀/寫 | 說明 |
currentTarget | Element | 只讀 | 其事件處理程序當前正在處理事件的那個元素 |
target | Element | 只讀 | 事件的目標 |
MDN:
currentTarget: 當事件遍歷DOM時,標識事件的當前目標。它總是引用事件處理程序附加到的元素,而不是event.target,它標識事件發生的元素。
target:一個觸發事件的對象的引用。
結論
emmmm,這說的真晦澀,不自己動手還真看不出有啥差別,先給結論吧:currentTarget指的是事件觸發后,冒泡到綁定處理程序的元素,就是綁定事件處理程序的元素,target指的是觸發事件的元素。
demo
html:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>currentTarget&target</title> 6 </head> 7 <body> 8 <div id="div1"> 9 <div id="div2"> 10 <div id="div3"> 11 click me ~ 12 </div> 13 </div> 14 </div> 15 </body> 16 </html>
JavaScript:
1 let div1 = document.getElementById('div1'), 2 div2 = document.getElementById('div2'), 3 div3 = document.getElementById('div3'); 4 5 div1.addEventListener('click', (ev) => { 6 console.log(`target: ${ev.target.id} currentTarget: ${ev.currentTarget.id}`); 7 }); 8 9 div2.addEventListener('click', (ev) => { 10 console.log(`target: ${ev.target.id} currentTarget: ${ev.currentTarget.id}`); 11 }); 12 13 div3.addEventListener('click', (ev) => { 14 console.log(`target: ${ev.target.id} currentTarget: ${ev.currentTarget.id}`); 15 });
當單擊div3時,事件依次冒泡。但是觸發時間的元素為div3,所以target為div3,而從捕獲階段,到冒泡階段途徑了元素div3,div2,div1,綁定事件處理元素的依次為div3,div2,div1,所以currentTarget為div3,div2,div1。
瀏覽器兼容性
target
在 IE6-8 中,事件模型與標准不同。使用非標准的 element.attachEvent()
方法綁定事件監聽器。在該模型中,事件對象有一個 srcElement
屬性,等價於target
屬性。
target = ev.target || ev.srcElement;
currentTarget
IE6-8中,事件模型與標准不一樣,使用非標准的 element.attachEvent()
來綁定事件監聽器。該模型中,沒有等價於 event.currentTarget
的接口,且 this
指向全局對象。
一種模擬 event.currentTarget
功能的方法是:將監聽器包在一個函數中,然后使用 Function.prototype.call
調用這個包裝函數,並將元素對象作為第一個參數。這樣,this
就是想要的值了。