#javascript
#javascript
Вопрос:
Мне нужно чередовать цвет трех чисел, содержащих класс ‘.holiday’, и они равны 24, 25 и 31. Но с помощью этого кода я получаю изображение. После второго щелчка цифры 24 и 31 становятся красными, а 25 — синими.
let holidayClick = () => {
const holidayBtn = document.querySelector('#btn-holiday');
const holidayLi = document.querySelectorAll('.holiday');
let isColored = false;
for (let li of holidayLi) {
holidayBtn.addEventListener('click', () => {
if (isColored) {
li.style.color = 'red';
isColored = false;
} else {
li.style.color = 'blue';
isColored = true;
}
});
}
};
holidayClick();
Комментарии:
1. Вы пробовали устанавливать точки останова в своем коде и проходить через него?
2. похоже
isColored
, что он является общим для всех обработчиков кликов. Вероятно, это не то, что вы хотите.3. Да, я это сделал. Но я получаю эту ошибку: неперехваченная ошибка ссылки: документ не определен script.js: 11 Нет доступного отладчика, не удается отправить «переменные»
Ответ №1:
Не совсем понятно, чего вы хотите достичь. Но если вы хотите переключать цвета для определенных li
элементов, используя some state ( isColored
) , вы можете сохранить состояние в атрибуте данных для li
элемента. Обработчик события для кнопки должен быть создан один раз, в фрагменте он создается на уровне документа (делегирование события)
document.addEventListener("click", holidayClick)
function holidayClick(evt) {
// return if the click did not originate from the button
if (evt.target.id !== "btn-holiday") { return; }
// find all li /w attribute [data-holidaycolored] and
// colorize them according to the value of the attribute
document.querySelectorAll('[data-holidaycolored]').forEach(
li => {
const isColored = !! li.dataset.holidaycolored;
// ^ convert to number
// ^ convert number to boolean
li.style.color = !isColored ? "blue" : "red";
li.dataset.holidaycolored = !isColored;
// ^ flip boolean and convert to number
});
}
<ul>
<li>...</li>
<li data-holidaycolored="0">21</li>
<li data-holidaycolored="0">22</li>
<li>23</li>
<li>24</li>
<li>...</li>
<li data-holidaycolored="0">31</li>
</ul>
<button id="btn-holiday">holidays</button>
Возможно, вы также хотите раскрасить отдельные li
элементы. В этом случае:
document.addEventListener("click", holidayClick)
function holidayClick(evt) {
const origin = evt.target;
// return if the click did not originate from the button
if (!origin.dataset.colorholiday) { return; }
// colorize the clicked element according to the value of the attribute
const isColored = !! origin.dataset.holidaycolored;
origin.style.color = !isColored ? "blue" : "red";
origin.dataset.holidaycolored = !isColored;
}
li {
cursor: pointer;
}
<ul>
<li>...</li>
<li data-colorholiday="0">21</li>
<li data-colorholiday="0">22</li>
<li data-colorholiday="0">23</li>
<li data-colorholiday="0">24</li>
<li>...</li>
<li data-colorholiday="0">31</li>
</ul>