* 这被编辑以允许目标class的孩子触发事件。有关详细信息,请参阅答案底部。*
将事件侦听器添加到经常添加和删除项目的类的替代答案。这是受 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/