我正在构建具有暗模式开关的应用。它在第一次单击时起作用,但是在此之后,它在每个second单击时起作用。
(此代码段显示一个复选框。在项目中,它看起来像一个真实的开关)
您知道如何通过一次单击就可以使用它吗?
const body = document.getElementById('body');
let currentBodyClass = body.className;
const darkModeSwitch = document.getElementById('darkModeSwitch');
//Dark Mode
function darkMode() {
darkModeSwitch.addEventListener('click', () => {
if (currentBodyClass === "lightMode") {
body.className = currentBodyClass = "darkMode";
} else if (currentBodyClass === "darkMode") {
body.className = currentBodyClass = "lightMode";
}
});
}
#darkModeSwitch {
position: absolute;
left: 15px;
top: 15px;
}
.darkMode { background-color: black; transition: ease .3s; }
.lightMode { background-color: #FFF; transition: ease .3s; }
#darkModeSwitch input[type="checkbox"] {
width: 40px;
height: 20px;
background: #fff89d;
}
#darkModeSwitch input:checked[type="checkbox"] {
background: #757575;
}
#darkModeSwitch input[type="checkbox"]:before {
width: 20px;
height: 20px;
background: #fff;
}
#darkModeSwitch input:checked[type="checkbox"]:before {
background: #000;
}
<body id="body" class="lightMode">
<div id="darkModeSwitch">
<input type="checkbox" onclick="darkMode()" title="Toggle Light/Dark Mode" />
</div>
</body>
在复选框的每次单击事件上,您正在darkModeSwitch
元素上设置一个新的事件侦听器,可以将其删除
const body = document.getElementById('body');
let currentBodyClass = body.className;
const darkModeSwitch = document.getElementById('darkModeSwitch');
//Dark Mode
function darkMode() {
if (currentBodyClass === "lightMode") {
body.className = currentBodyClass = "darkMode";
} else if (currentBodyClass === "darkMode") {
body.className = currentBodyClass = "lightMode";
}
}
#darkModeSwitch {
position: absolute;
left: 15px;
top: 15px;
}
.darkMode { background-color: black; transition: ease .3s; }
.lightMode { background-color: #FFF; transition: ease .3s; }
#darkModeSwitch input[type="checkbox"] {
width: 40px;
height: 20px;
background: #fff89d;
}
#darkModeSwitch input:checked[type="checkbox"] {
background: #757575;
}
#darkModeSwitch input[type="checkbox"]:before {
width: 20px;
height: 20px;
background: #fff;
}
#darkModeSwitch input:checked[type="checkbox"]:before {
background: #000;
}
<body id="body" class="lightMode">
<div id="darkModeSwitch">
<input type="checkbox" onclick="darkMode()" title="Toggle Light/Dark Mode" />
</div>
</body>
[每次单击复选框时,您都将另一个eventListener添加到darkModeSwitch
-将addEventListener
移出函数并删除onclick
然后,您需要在let currentBodyClass = body.className;
功能内移动darkModeSwitch
,以便每次更新该值。将其置于函数之外,您将在运行时为其分配值once,然后再从不对其进行更新
最后,这没有意义
body.className = currentBodyClass = "darkMode";
相反,只是做
body.className = "darkMode";
const darkModeSwitch = document.getElementById('darkModeSwitch');
const body = document.getElementById('body');
//Dark Mode
darkModeSwitch.addEventListener('click', () => {
let currentBodyClass = body.className;
if (body.className === "lightMode") {
body.className = "darkMode";
} else if (currentBodyClass === "darkMode") {
body.className = "lightMode";
}
});
#darkModeSwitch {
position: absolute;
left: 15px;
top: 15px;
}
.darkMode {
background-color: black;
transition: ease .3s;
}
.lightMode {
background-color: #FFF;
transition: ease .3s;
}
#darkModeSwitch input[type="checkbox"] {
width: 40px;
height: 20px;
background: #fff89d;
}
#darkModeSwitch input:checked[type="checkbox"] {
background: #757575;
}
#darkModeSwitch input[type="checkbox"]:before {
width: 20px;
height: 20px;
background: #fff;
}
#darkModeSwitch input:checked[type="checkbox"]:before {
background: #000;
}
<body id="body" class="lightMode">
<div id="darkModeSwitch">
<input type="checkbox" title="Toggle Light/Dark Mode" />
</div>
</body>
const body = document.getElementById('body');
const darkModeSwitch = document.getElementById('darkModeSwitch');
// put classes into array
const themeClesses = [`lightMode`, `darkMode`];
//Dark Mode
function darkMode() {
// simply map through it and toggle
themeClesses.map(str => body.classList.toggle(str))
}
#darkModeSwitch {
position: absolute;
left: 15px;
top: 15px;
}
.darkMode { background-color: black; transition: ease .3s; }
.lightMode { background-color: #FFF; transition: ease .3s; }
#darkModeSwitch input[type="checkbox"] {
width: 40px;
height: 20px;
background: #fff89d;
}
#darkModeSwitch input:checked[type="checkbox"] {
background: #757575;
}
#darkModeSwitch input[type="checkbox"]:before {
width: 20px;
height: 20px;
background: #fff;
}
#darkModeSwitch input:checked[type="checkbox"]:before {
background: #000;
}
<body id="body" class="lightMode">
<div id="darkModeSwitch">
<input type="checkbox" onclick="darkMode()" title="Toggle Light/Dark Mode" />
</div>
</body>
使用输入类型更容易检查
var isChecked= document.getElementById('input[type="checkbox"]').checked;
if(isChecked){ //checked
//execute code here
}else{ //unchecked
//execute code here
}
每次单击按钮时,都会向开关添加一个新的事件侦听器。因此,每当您第二次单击按钮的黑暗模式时,它就会切换偶数次而不会发生变化。
一种简单的查看方法是在[]中添加日志>
let eventCount = 0; function darkMode() { console.log("Event was fired for the " + eventCount + "th time!"); eventCount++; darkModeSwitch.addEventListener('click', () => { if (currentBodyClass === "lightMode") { body.className = currentBodyClass = "darkMode"; } else if (currentBodyClass === "darkMode") { body.className = currentBodyClass = "lightMode"; } }); }
与其他答案一样,解决方案是删除方法中的addEventListener调用。