javascript - 两个相互抵消的事件监听器 - JS。为什么?
问题描述
我有一个下拉菜单的事件监听器,它工作得很好:
JS
const selected = document.querySelectorAll(".selected");
const optionsContainer = document.querySelectorAll(".options-container");
for(let i = 0; i < selected.length; i++){
selected[i].addEventListener("click", () => {
optionsContainer[i].classList.toggle("open");
selected[i].classList.toggle("open");
for (let j = 0; j < selected.length; j++){
if(i != j && selected[j].classList.contains("open")){
optionsContainer[j].classList.toggle("open");
selected[j].classList.toggle("open");
}
}
});
}
但是,现在我还想在用户单击块外时关闭下拉菜单(这涉及切换 optionsContainer 和选中)。当然,此切换取决于下拉菜单是否也打开。这是我想出的JS:
window.addEventListener("click", ()=>{
for(let i = 0; i < selected.length; i++){
if(selected[i].classList.contains("open")){
optionsContainer[i].classList.toggle("open");
selected[i].classList.toggle("open");
}
}
});
但是,当我使用这两种方法运行代码时,第一个事件侦听器也不会执行。
我认为这可能是因为点击菜单也算点击窗口,所以你切换两次并没有结果。但是,我仍然不确定...
解决方案
推荐阅读
- javascript - 我如何访问 selectedCurrency 的值
- bitcoind - sendfrom 方法的比特币节点 API 不起作用?
- regex - Regex: a character should not come consecutively not more than 3 times
- apache-spark - 默认情况下,spark 在哪个文件系统中查找读取文件?
- android - 如何解决此错误“com.google.ads.mediation.admob.AdMobAdapter cannot be cast to com.google.android.gms.ads.mediation.m”?
- c# - 在 MacBook Pro 中的 Visual Studio 代码上运行 .Net 应用程序
- smt - CVC4 相当于 Z3 的 seq.unit
- java - TCP 反向代理 Minecaft 未发送原始 IP
- javascript - 是否可以更新 Mongoose 文档中的对象?
- entity-framework - Scaffold-DbContext EF Core 时出现不明确的列名错误