1 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
您的代碼僅檢查元素是否event.target為.collapse-btn元素。您還需要檢查單擊的元素是否是該.collapse-btn元素的后代元素。
為了達(dá)到預(yù)期的結(jié)果,您可以使用這兩個(gè)條件來檢查 the 是event.targetthe.collapse-btn還是它的任何后代。要檢查后代元素,請(qǐng)使用通用選擇器*。
parent.addEventListener('click', (e) => {
? if (
? ? ? ?e.target.matches('.collapse-btn') ||?
? ? ? ?e.target.matches('.collapse-btn *')
? ) {
? ? ?// code
? }
});
演示
以下片段顯示了一個(gè)示例:
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>
您還可以將選擇器放在一個(gè)數(shù)組中,然后使用.some()方法檢查是否event.target匹配數(shù)組中的任何一個(gè)選擇器。
const selectors = ['.collapse-btn', '.collapse-btn *'];
parent.addEventListener('click', e => {
? if (selectors.some(s => e.target.matches(s))) {
? ? // code
? }
});
演示
以下片段顯示了一個(gè)示例:
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
為此,您需要執(zhí)行兩個(gè)步驟:
您首先需要獲取 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,因?yàn)榧词棺鳛閰?shù)傳遞給它的節(jié)點(diǎn)與調(diào)用方法的.contains()節(jié)點(diǎn)相同,方法也會(huì)返回 true 。.contains()
因此,以這種方式使用.closest()和.contains()方法涵蓋了兩種用例,即何時(shí).collapse-btn單擊或何時(shí)單擊其任何后代元素。
演示
以下片段顯示了一個(gè)簡(jiǎn)單的示例:
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>
添加回答
舉報(bào)