http://jsbin.com/xaguxuhiwu/1/edit?html,js,console,output爲什麼e.currentTarget會隨着jQuery的事件委託而改變?
<div id="container">
<button id="foo">Foo button</button>
<button id="bar">Bar button</button>
</div>
$('#container').on('click', function(e) {
var targetId = e.target.getAttribute('id');
// Manually do event delegation
if (targetId === 'foo') {
var currentId = e.currentTarget.getAttribute('id');
console.log('without delegation, currentTarget is: ' + currentId);
}
});
$('#container').on('click', '#foo', function(e) {
var currentId = e.currentTarget.getAttribute('id');
console.log('with delegation, currentTarget is: ' + currentId);
});
基本上,我對事件e.currentTarget的理解是,它反映了該事件已冒泡的地步。由於我在#container
元素上有一個事件監聽器,我預計在這兩種情況下currentTarget都是container
。
對於標準on
處理程序,這是正確的,如第一個示例所示。但是,使用事件委託(第二次單擊時參數#foo
)時,currentTarget將更改爲內部按鈕。
爲什麼e.currentTarget
在兩種情況之間改變? 具體而言,在後一種情況下,這是否意味着jQuery不會將事件偵聽器放在父元素(#container
)元素上?
在第二個函數中,當你點擊一個id =「foo」的元素時,你就會告訴jquery「Fire事件,它嵌套在id =」container「元素的某處。加載你的html元素,而不是在DOM加載後插入,你在技術上不需要'.on',而在第二個函數中,你可以訪問元素'#foo',而不必首先引用元素'#容器' –
另外,不用'e.currentTarget',你可以使用'this'。用vanilla JS你可以把'e.currentTarget.getAttribute('id')'改成'this.id'和'$(this).attr ('id')'在jQuery中。 –
@AaronEveleth:這不是我對jQuery中'.on'的理解。 '.on()'應該將一個監聽器添加到前一個選擇器中的任何元素。 當你添加第二個參數(又名使用事件委託)時,我的理解是jQuery不會調用回調函數,除非'event.target'匹配選擇器。 – AnilRedshift