【发布时间】:2017-09-25 00:23:22
【问题描述】:
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>
我想为每个“项目”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);
}
})
【问题讨论】:
-
"我想使用事件委托来绑定点击处理程序......" 你误用了“事件委托”这个表达,它是关于捕获冒泡事件,不附加侦听器。请在此处发布可运行代码,不要在其他地方发布。
标签: javascript dom