33-解决方案
8.8.2 解决方案
event.target 属性引用获取事件的元素,也就是具体的元素。
这意味着,如果在一个链接中有张图片而你单击了该链接, event.target 将是那张图片而不是链接。
那么,你怎么解决这个问题呢?如果你不打算使用事件委托,那么使用 this (函数作用域)或者 event.currentTarget (从jQuery 1.3起)应该可以解决。这两个属性总是指向绑定了事件处理程序的元素。如果你确实使用事件委托,那么需要找出预期的双亲元素。
从jQuery 1.3起,可以使用 closest() 。[12]正如文档中所指出的那样,它返回最靠近的元素,从当前位置一直上溯到双亲,后者匹配某个选择器。
如果你使用的是旧版本的jQuery,可以用如下代码模拟 closest() :
jQuery.fn.closest = function( selector ){
return this.map(function(){
var $parents = jQuery(this).parents();
return jQuery(this).add($parents).filter( selector )[0];
});
}
对此可以做一些性能上的改进,但是这个简单的版本能够用于一般的用途。
下面是使用 closest() 最常见情况的一个例子:
jQuery('table').click(function(e){
var $tr = jQuery(e.target).closest('tr');
// 对表格行作某些操作
});