【发布时间】:2021-12-21 12:26:52
【问题描述】:
我正在构建一个超级菜单,每个菜单上都有一个关闭按钮,效果很好。但是我需要编写一些 JavaScript 来说明,“如果您在打开的大型菜单之外单击,请关闭它”。
我在下面写了一个脚本。它确实会检测用户何时在超级菜单内部单击,但当他们在其外部单击时不会检测到。在这种情况下,删除使元素具有display: block; 的display-on 类。
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");
}
});
}
如果需要可以查看工作演示here。
谢谢。
【问题讨论】:
-
当然,OP 需要在任何
drop-down分类元素之外注册对 “out of drop-down” 事件的处理。document.body可能是适合聆听的元素。
标签: javascript dom event-handling dom-events event-delegation