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>
添加回答
舉報