当使用javascript将点击事件侦听器附加到主体时,如何编写仅在e.target
不是包含类active
或任何子元素的元素时才触发的条件?active
中存在需要可单击的子元素。类似于当您单击模态上的任何位置时,它都会保持打开状态,但DOM上的其他任何位置都会被删除?
document.body.addEventListener("click", e => {
if (!e.target ...) {
// trigger functions
}
}
实现此效果的一种方法是侦听单击,然后在DOM中从e.target
一直循环到document.body
。
向上循环时,检查每个元素,看它是否包含类.active
。如果是,则可以使用break
语句结束函数。
这意味着你仍然可以有.active
的子级,它们仍然可以点击,并将响应其他Event Listeners
触发的其他功能。
工作示例:
const myFunction = (e) => {
let containsActiveClass = false;
let reviewNode = e.target;
while (reviewNode.nodeName !== 'BODY') {
if (reviewNode.classList.contains('active')) {
containsActiveClass = true;
break;
}
reviewNode = reviewNode.parentNode;
}
if (containsActiveClass === false) {
window.alert('You clicked! (But not on .active or any of its child elements.)');
}
}
document.body.addEventListener('click', myFunction, false);
.container {
display: flex;
justify-content: space-around;
align-items: center;
height: 180px;
background-color: rgb(127, 127, 191);
cursor: pointer;
}
.active {
cursor: default;
}
.active,
.inactive {
position: relative;
display: inline-block;
flex: 0 0 120px;
height: 120px;
text-align: center;
font-family: sans-serif;
font-size: 14px;
background-color: rgb(255, 0, 0);
}
.active div,
.inactive div {
position: absolute;
top: 30px;
left: 30px;
width: 60px;
height: 60px;
background-color: rgb(255, 255, 0);
}
<div class="container">
<div class="inactive">Inactive
<div>Inactive Child</div>
</div>
<div class="active">Active
<div>Active Child</div>
</div>
<div class="inactive">Inactive
<div>Inactive Child</div>
</div>
</div>
您可以将其与css选择器匹配
document.querySelectorAll('div').forEach(elem=>{
console.log(elem.id, elem.matches('.active, .active *'))
})
<div id=d1>
<div id=d2 class=active>
<div id=d3></div>
</div>
<div id=d4>
<div id=d5></div>
<div id=d6 class=active></div>
</div>
</div>