1 回答
TA贡献1772条经验 获得超6个赞
您的代码仅检查元素是否event.target为.collapse-btn元素。您还需要检查单击的元素是否是该.collapse-btn元素的后代元素。
为了达到预期的结果,您可以使用这两个条件来检查 the 是event.targetthe.collapse-btn还是它的任何后代。要检查后代元素,请使用通用选择器*。
parent.addEventListener('click', (e) => {
if (
e.target.matches('.collapse-btn') ||
e.target.matches('.collapse-btn *')
) {
// code
}
});
演示
以下片段显示了一个示例:
const parent = document.querySelector('.container');
parent.addEventListener('click', e => {
if (
e.target.matches('.collapse-btn') ||
e.target.matches('.collapse-btn *')
) {
parent.classList.toggle('active');
}
});
.container {
background: #eee;
width: 120px;
height: 120px;
}
.container.active {
border: 2px solid;
}
.collapse-btn {
background: #999;
padding: 10px;
}
.collapse-btn span {
background: #fc3;
font-size: 1.3rem;
cursor: pointer;
}
<div class="container">
<div class="collapse-btn">
<span>Click</span>
</div>
</div>
您还可以将选择器放在一个数组中,然后使用.some()方法检查是否event.target匹配数组中的任何一个选择器。
const selectors = ['.collapse-btn', '.collapse-btn *'];
parent.addEventListener('click', e => {
if (selectors.some(s => e.target.matches(s))) {
// code
}
});
演示
以下片段显示了一个示例:
const parent = document.querySelector('.container');
parent.addEventListener('click', e => {
const selectors = ['.collapse-btn', '.collapse-btn *'];
if (selectors.some(s => e.target.matches(s))) {
parent.classList.toggle('active');
}
});
.container {
background: #eee;
width: 120px;
height: 120px;
}
.container.active {
border: 2px solid;
}
.collapse-btn {
background: #999;
padding: 10px;
}
.collapse-btn span {
background: #fc3;
font-size: 1.3rem;
cursor: pointer;
}
<div class="container">
<div class="collapse-btn">
<span>Click</span>
</div>
</div>
替代解决方案
不使用方法,而是使用和 方法.matches()
的组合来检查是元素还是元素的子元素。Element.closest()
Node.contains()
event.target
.collapse-btn
.collapse-btn
为此,您需要执行两个步骤:
您首先需要获取 the
.collapse-btn
的最近祖先event.target
。之后,您需要检查 是否
event.target
是在步骤 1 中选择的按钮的后代。
代码:
parent.addEventListener('click', (e) => {
const targetCollapseBtn = e.target.closest('.collapse-btn');
if (targetCollapseBtn && targetCollapseBtn.contains(e.target)) {
...
}
});
如果event.target是它.collapse-btn自己,那么
e.target.closest('.collpase-btn')
将返回e.target,即.collapse-btn和
targetCollapseBtn.contains(e.target)
也将返回 true,因为即使作为参数传递给它的节点与调用方法的.contains()节点相同,方法也会返回 true 。.contains()
因此,以这种方式使用.closest()和.contains()方法涵盖了两种用例,即何时.collapse-btn单击或何时单击其任何后代元素。
演示
以下片段显示了一个简单的示例:
const parent = document.querySelector('.container');
parent.addEventListener('click', e => {
const targetCollapseBtn = e.target.closest('.collapse-btn');
if (targetCollapseBtn && targetCollapseBtn.contains(e.target)) {
parent.classList.toggle('active');
}
});
.container {
background: #eee;
width: 120px;
height: 120px;
}
.container.active {
border: 2px solid;
}
.collapse-btn {
background: #999;
padding: 10px;
}
.collapse-btn span {
background: #fc3;
font-size: 1.3rem;
cursor: pointer;
}
<div class="container">
<div class="collapse-btn">
<span>Click</span>
</div>
</div>
添加回答
举报