让我们说我有一些HTML标记,如下所示:
<a href='#!' class='foo'><i class='bar'></i> Link</a>
然后,说,我正在将jQuery事件处理程序绑定到我的文档,如下所示:
$(document).on('click','.foo','click',function(e) {
var obj = e.target;
console.log(obj);
});
如果我点击锚点中的文字(&#34; Link&#34;),&#34; obj&#34;最终被设置为&#34; a.foo&#34;元件。但是,当我点击链接中的图标时,&#34; obj&#34;最终被设置为&#34; i.bar&#34;元件。
我添加了代码来找到这样的相应元素:
$(document).on('click','.foo','click',function(e) {
var obj = e.target;
if (!$(obj).hasClass('foo')) {
obj = $(obj).parents('.foo').first();
}
console.log(obj);
});
我只是想知道是否有一个更优雅的解决方案。例如,如果你能打电话给&#34; e.selectorTarget&#34;那就太好了。什么的,它会返回那个项目。
答案 0 :(得分:3)
您的.on()
调用正在使用委派的事件语法并指定了'.foo'
选择器,因此jQuery会将this
设置为.foo
元素。
$(document).on('click','.foo','click',function(e) {
console.log(this);
});
正如the documentation所述:
当jQuery调用处理程序时,
this
关键字是对传递事件的元素的引用;对于直接绑定事件,这是附加事件的元素,对于委托事件,这是与[指定]selector
匹配的元素。 (请注意,如果事件来自后代元素,则这可能不等于event.target
。)
请注意,在'click'
的第三个(数据)参数中指定.on()
是多余的。如果您要为多种类型的事件调用相同的函数,则可以使用event.type
property获取类型。
答案 1 :(得分:1)
使用event.currentTarget
来引用处理事件的元素(在本例中为.foo
),即使this
可能不会。
根据jQuery文档:
如果您使用的是jQuery.proxy或其他形式的范围操作,
this
将等于您提供的任何上下文,而不是event.currentTarget
这意味着如果使用代理,this
将引用作为代理提供的对象,因此event.currentTarget
是获得处理事件的元素的保证方式。
您还可以使用event.delegateTarget
来引用委托事件的元素(在这种情况下为document
,因为您正在使用$(document).on()
)。
这是一个显示目标与之间差异的小提琴:http://jsfiddle.net/2s2CE/