javascript - 停止侦听器在同一单击 EventListener 内触发而不将其删除
问题描述
所以,我需要一个表单在单击事件侦听器内部单击时保持显示。这个概念是,您通过单击按钮打开表单,然后出现表单(这有效)。如果您单击页面上的任意位置(这也有效),表单将关闭,但如果您单击表单,我需要它保持打开状态。目前,如果我点击表格,它就会消失。事件尝试“event.preventDefault()”
任何帮助,将不胜感激
HTML
<button class="button">Click me</button>
<div class="form">
This is a form
</div>
CSS
.form {
display: none;
}
.form.show-form {
display: block;
}
JS
let searchToggle = document.querySelector('.button');
let searchForm = document.querySelector('.form');
document.addEventListener('click', function(event) {
let toggled = searchToggle.contains(event.target);
if (toggled) {
searchForm.classList.add('show-form');
if (event.searchForm === toggled) {
return false;
}
} else {
searchForm.classList.remove('show-form');
}
});
更新 #1:@trincot 的解决方案
let searchToggle = document.querySelector('.button');
let searchForm = document.querySelector('.form');
document.addEventListener('click', function(event) {
let toggled = searchToggle.contains(event.target);
if (toggled) {
searchForm.classList.add('show-form');
} else if (!event.target.closest('.show-form')) {
searchForm.classList.remove('show-form');
}
});
解决方案
检查是否event.target
是以表单为祖先的元素还是表单本身(使用closest
):
} else if (!event.target.closest(".show-form")) {
searchForm.classList.remove('show-form');
}
推荐阅读
- javascript - scrollToIndex 上的平面列表问题
- angular - 从 url 在页面之间传递数据
- vmware-clarity - 将最后一个数据网格行推到网格底部
- angularjs - 如何在指令中制作我自己的 ng-change 和 ng-model?
- sql - SQL 查询模式选择
- jquery - 如何在 Vue.js 中导入 owl carousel
- arrays - 将类型从字符串转换为字符串数组
- react-native - 如何在“GraphQL for react-native”中链接模式(客户端和服务器)
- angular - 数据表未按 dd/MM/yyyy 格式的日期排序 Angular
- java - java MultipartFile.transferTo 返回 NullPointerException