自个研究了两天,最后关键问题竟然是要将事件调用使用变量才能成功移除事件监听器,要不不断点空白处都会叠加str, 完整js代码如下: function showMenu(str) { console.log(str); event.preventDefault(); // 阻止默认的链接跳转行为 var menu = document.getElementById(str); var bd= Menu.bind(null,str) menu.style.display = "block"; setTimeout(function () { menu.classList.add("show"); document.addEventListener("click",bd); }, 100); function Menu (event) { console.log(event); var menuElement = document.getElementById(event); // 检查点击的元素是否为菜单内部的元素 if (!menuElement.contains(event.target)) { menuElement.style.display = "none"; // 移除点击事件监听器 document.removeEventListener("click",bd); } } } |