*对此进行了编辑,以允许目标类别的孩子触发事件。有关详细信息,请参见答案底部。*
将事件侦听器添加到经常添加和删除项目的类的替代答案。这是受jQuery on
函数启发的,您可以在其中传递事件正在侦听的子元素的选择器。
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
元素子级的点击,并且如果点击的目标具有与选择器匹配的父级,则将处理class事件。您可以根据需要添加和删除元素,而不必向单个元素添加更多的点击侦听器。即使是在添加此侦听器之后添加的元素,这也将全部捕获它们,就像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/