javascript - 使用 JavaScript e.target 在元素外部单击不起作用
问题描述
我正在构建一个大型菜单,每个菜单上都有一个关闭按钮,效果很好。但是我需要编写一些 JavaScript 来说明,“如果您在打开的大型菜单之外单击,请关闭它”。
我在下面写了一个脚本。它确实会检测用户何时在超级菜单内部单击,但当他们在其外部单击时不会检测到。在这种情况下,删除display-on
使元素具有的类display: block;
。
const dropDownMenu = document.getElementsByClassName("drop-down");
for (let i = 0; i < dropDownMenu.length; i++) {
dropDownMenu[i].addEventListener("click", (e) => {
// If clicking in any area that has drop-down class, do nothing.
if (dropDownMenu[i].contains(e.target)) {
console.log("clicked in mega menu area");
// If clicking in any area outside drop-down class, remove display-on class which closes the menu.
} else {
console.log("clicked outside mega menu area");
document.querySelector(".display-on").classList.remove("display-on");
}
});
}
如果需要,可以在这里查看工作演示。
谢谢。
解决方案
从上面的评论...
“当然,OP 需要在任何分类元素之外注册对“下拉”事件的处理。可能是正确的监听元素。”
drop-down
document.body
......像这样的东西......
function handleDropDownMenuBehavior(evt) {
if (evt.target.closest('.drop-down') === null) {
document.querySelector(".display-on").classList.remove("display-on");
console.log("clicked outside mega menu area");
} else {
console.log("clicked in or at mega menu area");
}
}
document.body.addEventListener('click', handleDropDownMenuBehavior);
推荐阅读
- angular - 使用 Angular 7 将 Ag-Grid 导出为 PDF
- node.js - 如何在nodejs中将一个对象分配为另一个对象的属性
- pdf - SSRS 报告导出为 PDF,页面中间有硬分页符
- java - Spring 中使用 MappingMediaTypeFileExtensionResolver 的受保护方法的问题
- firebase - 将 JSON 数据从“Export Collections to BigQuery”firebase 扩展中获取为行列格式
- r - 如何在R中找到3D刻面的凸包
- python - 将变量传递给项目的另一个脚本时出错
- python - 根据另一个带有熊猫的df中的信息,在另一个df中添加一个新列
- plsql - 如何使用PLSQL方法将select语句数据导出到excel
- json - 基于两个 JSONSchema 为实例数据生成 JSONPatch