#javascript #dom-events
#javascript #dom-события
Вопрос:
const btnDarkLight = (btn) => {
document.addEventListener("click", (e) => {
if (e.target.matches(btn)) {
document.querySelector(btn);
let moon = document.body.classList.toggle("oscuro");
}
if (e.target.matches(btn)) {
if (this.value === "🌙") {
document.querySelector(btn).innerText = "☀️";
} else {
document.querySelector(btn).innerText = "🌙";
}
}
})
}
btnDarkLight("#btn-light-dark");
<button id="btn-light-dark" class="button-dark" type="button">🌙</button>
Я пытаюсь изменить значок внутри кнопки, когда активирован темный режим, но условие не работает.
Комментарии:
1. Войдите
this.value
в консоль. Вероятно, это не то, что вы ищете.2. В этом так много неправильных вещей. во-первых, не создавайте прослушивателя внутри вызываемой функции — в конечном итоге вы создадите много, много из них. Во-вторых, вам не нужен
querySelect
элемент button, потому что он передается в вашу функцию. в-третьих, предоставление точно такого же условияif
является избыточным и ненужным. Слишком многое нужно решить.3. @RandyCasburn Нет ничего плохого в том, чтобы поместить код внутри функции, если только функция не вызывается несколько раз (т. Е. Не добавляйте прослушиватель событий внутри другого прослушивателя).
4.
this.value
должно бытьthis.innerText
.5. @Barmar — Тогда поместите его в IIFE. Функция-оболочка вообще не нужна и предполагает, что она вызывается несколько раз (потенциально).
Ответ №1:
Вам нужно проверить e.target.innerText
, не this.value
. Поскольку вы определили прослушиватель с помощью функции со стрелкой, this
унаследованной от вызывающей среды, она не является целью события. И содержимое кнопки находится в ее тексте, а не в значении.
const btnDarkLight = (btn) => {
document.addEventListener("click", (e) => {
if (e.target.matches(btn)) {
let moon = document.body.classList.toggle("oscuro");
if (e.target.innerText === "🌙") {
e.target.innerText = "☀️";
} else {
e.target.innerText = "🌙";
}
}
})
}
btnDarkLight("#btn-light-dark");
<button id="btn-light-dark" class="button-dark" type="button">🌙</button>
Ответ №2:
Сэкономьте себе много работы, просто сделайте это с помощью css и переключите соответствующие классы.
document.querySelector("#btn-light-dark").addEventListener("click", function(){
this.classList.toggle("day");
this.classList.toggle("night");
});
.day:before {
content:'☀️'
}
.night:before {
content:'🌙'
}
<button id="btn-light-dark" class="day"></button>
Ответ №3:
Я бы посмотрел на класс и не полагался на текст кнопки.
const btnDarkLight = (btn) => {
const btnElem = document.querySelector(btn);
const setText = () => {
const text = document.body.classList.contains('oscuro') ? '🌙' : '☀️';
btnElem.textContent = text;
}
document.addEventListener("click", (e) => {
if (e.target.matches(btn)) {
document.body.classList.toggle('oscuro');
setText();
}
});
setText();
}
btnDarkLight("#btn-light-dark");
.oscuro {
background-color: black;
}
<button id="btn-light-dark" class="button-dark" type="button">🌙</button>
или просто полагаться на CSS
const btnDarkLight = (btn) => {
document.addEventListener("click", (e) => {
if (e.target.matches(btn)) {
document.body.classList.toggle('oscuro');
}
});
}
btnDarkLight("#btn-light-dark");
.oscuro {
background-color: black;
}
#btn-light-dark::after {
content: '☀️';
}
body.oscuro #btn-light-dark::after {
content: '🌙';
}
<button id="btn-light-dark" class="button-dark" type="button"></button>
Ответ №4:
Вы можете использовать этот код ниже
document.getElementById('btn-light-dark').addEventListener("click", (e)=>{
if (e.target.innerText === "🌙") {
e.target.innerText = "☀️";
document.body.classList.toggle("oscuro")
} else e.target.innerText = "🌙";
})
<button id="btn-light-dark" class="button-dark" type="button">🌙</button>