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