【发布时间】:2014-06-09 09:31:33
【问题描述】:
我正在尝试在 vanilla JS 中进行事件委托。我在这样的容器中有一个按钮
<div id="quiz">
<button id="game-again" class="game-again">
<span class="icon-spinner icon"></span>
<span>Go again</span>
</button>
</div>
在David Walsh's nice instructions 之后,我正在向按钮的祖先添加一个事件处理程序,如下所示:
this.container.addEventListener('click', function(e){
if (e.target && e.target.id == 'game-again') {
e.stopPropagation();
self.publish('primo:evento');
}
});
其中this.container 是#quiz 元素。这在一半时间有效,但其余时间单击事件的目标是按钮内的跨度之一,因此不调用我的事件处理程序。处理这种情况的最佳方法是什么?
【问题讨论】:
-
你需要支持哪些浏览器?
-
IE9+ 和现代主流
-
那么你可以使用
.matches,只要你得到无前缀的版本并使用matches.call(e.target,"#game-again,#game-again *")——更多细节请看我的回答。 -
如果您想要更通用的事件委托实现,以及一些仍然是原生 JavaScript 的便捷增强功能,请查看 Oxydizr。它使用 HTML5 数据属性,因此您可以将行为与样式完全分离:
<button data-action="tasks.remove">X</button>。您可以将自定义数据传递给从data-action-paramsHTML5 数据属性获取的每个操作处理程序。 -
谢谢 Greg,我去看看。
标签: javascript dom publish-subscribe event-delegation