https://jsfiddle.net/y444stqv/3/包括上动态创建的元素
怎样包括父项的所有子元素“单击”事件监听器上点击事件侦听器的子元素?例如,我动态创建以下html:
<div id="content">
<div id="donotexecuteclicklistener">But don't include me!</div>
<!-- Dynamically generated -->
<div class="items">
<div class="item item-0">
<h3>Item 0</h3>
<p>Some desc</p>
</div>
<div class="item item-1">
<h3>Item 1</h3>
<p>Some desc</p>
</div>
<div class="item item-2">
<h3>Item 2</h3>
<p>Some desc</p>
</div>
<div class="item item-3">
<h3>Item 3</h3>
<p>Some desc</p>
</div>
</div>
</div>
我想要将点击处理程序绑定到每个“item”div。因此,如果您单击任何“item”(即子节点“h3”或“p”标记)节点的子元素,我仍然想执行“handleClick”单击处理程序。但是,当你点击ID“donotexecuteclicklistener”,我不希望这个点击处理程序触发。
var items = [];
var $content = document.getElementById('content');
for (var i = 0; i < 4; i++) {
// using ES6 template literals for ease
var item = `
<div class="item" id="item-${i}">
<h3>Item ${i}</h3>
<p>Some desc about item ${i}</p>
</div>
`;
items.push(item);
}
var html = items.join(' ');
$content.innerHTML = html;
var handleClick = function(event) {
console.log('do something with item', this, event);
}
$content.addEventListener('click', function(event) {
console.log(event.target.id);
var elements = $content.querySelectorAll('.item');
var hasMatch = Array.prototype.indexOf.call(elements, event.target) >= 0;
console.log(hasMatch);
if (hasMatch) {
handleClick.call(event.target, event);
}
})
“*我想使用事件委托绑定一个单击处理... *”你是滥用表达“*事件委托*”,这是有关捕获冒泡事件,而不是听众。请在这里发布可运行代码,而不是其他地方。 – RobG