* 对此进行了编辑,以允许目标类的孩子触发事件。有关详细信息,请参阅答案底部。*
将事件侦听器添加到经常添加和删除项目的类的替代答案。这受到 jQueryon
函数的启发,您可以在其中为事件正在侦听的子元素传递选择器。
var base = document.querySelector('#base'); // the container for the variable content
var selector = '.card'; // any css selector for children
base.addEventListener('click', function(event) {
// find the closest parent of the event target that
// matches the selector
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// handle class event
}
});
小提琴:https ://jsfiddle.net/u6oje7af/94/
这将侦听元素的子base
元素的点击,如果点击的目标有一个匹配选择器的父元素,则将处理类事件。您可以根据需要添加和删除元素,而无需向单个元素添加更多点击侦听器。即使是在添加此侦听器之后添加的元素,这也会捕获它们,就像 jQuery 功能一样(我想这在引擎盖下有点相似)。
这取决于传播的事件,因此如果您stopPropagation
在其他地方进行事件,这可能不起作用。此外,该closest
功能显然与 IE 存在一些兼容性问题(什么没有?)。
如果您需要重复听这种类型的动作,这可以变成一个函数,比如
function addChildEventListener(base, eventName, selector, handler) {
base.addEventListener(eventName, function(event) {
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// passes the event to the handler and sets `this`
// in the handler as the closest parent matching the
// selector from the target element of the event
handler.call(closest, event);
}
});
}
===========================================
编辑:这篇文章最初使用该matches
功能事件目标上的 DOM 元素,但这将事件的目标限制为仅直接类。它已更新为使用该closest
函数,允许所需类的子级事件也触发事件。原始matches
代码可以在原始小提琴中找到:
https ://jsfiddle.net/u6oje7af/23/