javascript - 'if' 语句和 eventListener 问题
问题描述
我正在建立一个网站,现在我在尝试获取 if 语句来读取状态变量的变化时遇到了问题。
当我单击正文中的任何位置时,我试图关闭我的导航栏菜单,而不是导航栏。但是,我的包含主体事件侦听器的 if 语句将不会执行,因为(我认为)用于条件的状态变量的更改(菜单打开时为真,菜单关闭时为假)只是不被阅读。
当我打开导航菜单时,状态变量的更改变为 true,正如它所预期的那样。当我使用导航栏上的按钮关闭菜单时,状态变量的更改按预期更改为 false。
这是我的代码:
"use strict";
const btnNav = document.querySelector(".nav-btn--container");
const linkContainer = document.querySelector(".link-container");
const header = document.querySelector(".header");
const sidebar = document.querySelector(".sidebar");
const bodyChildren = header.parentElement.children;
const navBtn = document.querySelector(".nav-btn");
const menu = document.querySelector(".sidebar__menu");
const body = document.querySelector(".container");
/**** change of state variables ****/
let menuIsOpen = false;
/**** functions ****/
const closeMenu = function () {
addRemoveBlur("remove");
navBtn.classList.remove("nav-btn--opened");
sidebar.classList.remove("blur");
navBtn.classList.add("nav-btn--closed");
menu.style.visibility = "hidden";
menu.style.transform = "translateX(-150%)";
menuIsOpen = false;
};
const openMenu = function () {
addRemoveBlur("add");
navBtn.classList.remove("nav-btn--closed");
navBtn.classList.add("nav-btn--opened");
menu.style.visibility = "visible";
menu.style.transform = "translateX(0%)";
menuIsOpen = true;
};
const closeMenuByBody = function (e) {
const click = e.target;
closeMenu();
};
const openCloseMenu = function () {
if (!menuIsOpen) {
openMenu();
return;
}
if (menuIsOpen) {
closeMenu();
return;
}
};
/**** this is the problem ****/
if (menuIsOpen) {
body.addEventListener("click", function (e) {
closeMenuByBody(e);
});
}
解决方案
问题是事件侦听器从未初始化,因为您的menuIsOpen
变量始终被声明为 false。
您应该将 if 语句切换为包含在 click 事件处理程序中,如下所示:
body.addEventListener("click", function (e) {
if (menuIsOpen) {
closeMenuByBody(e);
}
});
您还应该考虑对您的方法进行以下更改openCloseMenu
(此处重命名为toggleMenu
):
const toggleMenu = function () {
if (menuIsOpen) {
closeMenu();
} else {
openMenu();
}
};
当您评估一个布尔值时,无需在两个不同的if
表达式中对其进行测试:您检查它是否为真,如果是则做某事,或者您知道它是假的而做某事。
您也可以删除您的closeMenuByBody
方法,然后从事件侦听器中调用该closeMenu
方法,因为您没有在其中执行任何操作:
body.addEventListener("click", function (e) {
if (menuIsOpen) {
e.preventDefault();
closeMenu();
}
});
推荐阅读
- mailkit - 搜索/GetMessage 错误“System.IO.IOException:无法从传输连接中读取数据”
- c# - 如何将字典中的重复值合并为一个值
- datatables - 试图对数据表进行求和,但它只是第一页的求和
- c# - 我的发送函数(套接字库:system.net & system.net.sockets)有一些错误
- r - 在R中划分按区域分组的两列
- python - 如何使用 websocket 每 3 秒发送一次 JSON [Python 服务器,js 客户端]
- kubernetes - Rook Ceph Operator 在检查集群状态时挂起
- c# - 如何使用带有 .net core 2.2 的实例 api 将全局配置选项添加到 Automapper v8
- ios - 如何在使用 iOS 13 中新的字体管理功能时限制对字体的访问?
- swift - 无法从 Userdefaults 访问数据 - Swfit