在我的大量ajax代码中,我经常将"click"事件绑定在body标签上,并根据$(e.target)和$.fn.hasClass()进行操作。然而,当我点击一个带有标签的锚点时,$(e.target)会等于该节点,而不是我想要的父级锚点。
从现在开始,我使用了这个技巧(var $t = $(e.target);):
从现在开始,我使用了这个技巧(var $t = $(e.target);):
/** bubbling **/
if($t.get(0).tagName !== "A" && $t.get(0).tagName !== "AREA") {
$t = $t.parent("a");
if(empty($t)) return true;
//else console.log("$t.bubble()", $t);
}
感觉有些不对...您有更好的实现方式吗?
$.fn.live()
并不能解决我的问题,因为它仍然会返回作为目标。此外,我正在寻求速度(在基于Atom的触摸设备上运行),而live
显得要慢得多(两倍):http://jsperf.com/bind-vs-click/3
事实上,正如@Guffa所指出的那样,使用$.fn.live()
解决了冒泡的问题,因为我不再需要event.target
。我猜这里没有其他“正确”的答案(在容器上使用绑定)。
live
方法,则无需使用事件目标,它将根据您用于注册的选择器调用不同的函数。 - Guffa$('a.someclass')
的初始调用可能是昂贵的,并且在使用事件委托时可以避免(如果 jQuery 可以预测此调用仅用于注册选择器,则会跳过查找,但它无法)。如果您使用的是jQuery 1.4.x,可以改用delegate
,并使用一个更便宜的选择器开始(例如$(document).delegate('a.someclass', 'click', handler);
)。 - eyelidlessness