【发布时间】:2014-05-07 03:30:42
【问题描述】:
在 vanilla js 中进行事件委托的最佳方式(最快/正确)是什么?
例如,如果我在 jQuery 中有这个:
$('#main').on('click', '.focused', function(){
settingsPanel();
});
我怎样才能把它翻译成 vanilla js?也许与.addEventListener()
我能想到的办法是:
document.getElementById('main').addEventListener('click', dothis);
function dothis(){
// now in jQuery
$(this).children().each(function(){
if($(this).is('.focused') settingsPanel();
});
}
但这似乎效率低下,尤其是如果#main 有很多孩子。
那么这是正确的做法吗?
document.getElementById('main').addEventListener('click', doThis);
function doThis(event){
if($(event.target).is('.focused') || $(event.target).parents().is('.focused') settingsPanel();
}
【问题讨论】:
-
从
event.target开始,看是否匹配选择器,如果匹配,调用函数。然后遍历它的祖先并做同样的事情,直到你到达this元素。您可以使用node.matchesSelector()进行测试,尽管在某些浏览器中它是使用特定于浏览器的标志实现的,因此您要么需要将其包装在一个函数中,要么将标志方法放在Element.prototype.matchesSelector -
建议您将其发布为答案。
-
@EvanTrimboli:我不喜欢发布答案。我会让别人得到代表。如果您愿意,请随意。
-
@cookiemonster 为什么我会找到子元素然后上去?
-
@MrGuru:因为这就是事件委托的工作方式。您必须查看元素层次结构中是否有任何节点与选择器匹配,从事件发起的元素开始,到您绑定处理程序的元素停止。
标签: javascript