10.07.2022, 13:48
|
Профессор
|
|
Регистрация: 25.04.2022
Сообщений: 159
|
|
Изменение поведения выбранных чекбоксов
У меня есть список ul с чекбоксами в каждом li.
<ul class="list">
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Buy milk</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Pick up Tom from airport</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Visit party</li>
</ul>
Мне нужно изменить поведения каждого li элемента при клике на соответствующий чекбокс. Делаю таким образом и у меня добавляется класс 'list__item_done' только к первому элементу li. При клике на другие чекбоксы класс 'list__item_done' не назначается. Как это исправить?
const chbx = document.querySelector('.list__item-checkbox');
const li = document.querySelector('.list__item');
chbx.addEventListener('click', () => {
if (chbx.checked) {
li.classList.add('list__item_done');
} else {
li.classList.remove('list__item_done');
}
});
|
|
10.07.2022, 13:59
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
Сообщение от NovichokJS
|
Как это исправить?
|
прочитать ответы на предыдущую тему или сделать цикл по всем li
|
|
10.07.2022, 14:10
|
Профессор
|
|
Регистрация: 25.04.2022
Сообщений: 159
|
|
Сообщение от рони
|
прочитать ответы на предыдущую тему или сделать цикл по всем li
|
const chbx = document.querySelector('.list__item-checkbox');
const li = document.querySelectorAll('.list__item');
chbx.addEventListener('click', () => {
for (let i = 0; i < li.length; i++) {
if (chbx.checked) {
li.classList.add('list__item_done');
} else {
li.classList.remove('list__item_done');
}
}
});
Ошибка: cannot reat property undefined (reading 'add')
|
|
10.07.2022, 14:16
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
NovichokJS,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
ul {
list-style: none;
width: 240px;
}
.list__item_done {
background-image: -webkit-linear-gradient(left, #0000CD, #FF0000);
background-image: linear-gradient(to right, #0000CD, #FF0000);
color: #FFFFFF;
}
</style>
<script>
/* делегирование */
document.addEventListener("DOMContentLoaded", function() {
let ul = document.querySelector(".list");
ul.addEventListener("change", function({
target
}) {
target.closest("li").classList.toggle("list__item_done", target.checked)
})
})
/* цикл */
/* document.addEventListener("DOMContentLoaded", function() {
document.querySelectorAll(".list li").forEach(li =>
li.addEventListener("change", function({
target
}) {
li.classList.toggle("list__item_done", target.checked)
}))
})*/
</script>
</head>
<body>
<ul class="list">
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Buy milk</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Pick up Tom from airport</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Visit party</li>
</ul>
</body>
</html>
|
|
10.07.2022, 14:21
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
NovichokJS,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
ul {
list-style: none;
width: 240px;
}
.list__item_done {
background-image: -webkit-linear-gradient(left, #0000CD, #FF0000);
background-image: linear-gradient(to right, #0000CD, #FF0000);
color: #FFFFFF;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
const chbx = document.querySelector('.list');
const lis = chbx.querySelectorAll('.list__item');
chbx.addEventListener('click', () => {
for (let i = 0; i < lis.length; i++) {
let li = lis[i];
if (li.querySelector(":checked")) {
li.classList.add('list__item_done');
} else {
li.classList.remove('list__item_done');
}
}
});
})
</script>
</head>
<body>
<ul class="list">
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Buy milk</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Pick up Tom from airport</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Visit party</li>
</ul>
</body>
</html>
|
|
10.07.2022, 14:24
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
NovichokJS,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
ul {
list-style: none;
width: 240px;
}
.list__item_done {
background-image: -webkit-linear-gradient(left, #0000CD, #FF0000);
background-image: linear-gradient(to right, #0000CD, #FF0000);
color: #FFFFFF;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
const chbx = document.querySelector('.list');
const lis = chbx.querySelectorAll('.list__item');
for (let li of lis) {
li.addEventListener('click', () => {
if (li.querySelector(":checked")) {
li.classList.add('list__item_done');
} else {
li.classList.remove('list__item_done');
}
})
};
})
</script>
</head>
<body>
<ul class="list">
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Buy milk</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Pick up Tom from airport</li>
<li class="list__item"><input type="checkbox" class="list__item-checkbox">Visit party</li>
</ul>
</body>
</html>
|
|
10.07.2022, 14:38
|
Профессор
|
|
Регистрация: 25.04.2022
Сообщений: 159
|
|
Рони, спасибо. А эта обёртка обязательна в данном случае? - document.addEventListener("DOMContentLoaded", function() {
такого даже не учил еще. Без нее также отработает код
|
|
10.07.2022, 14:54
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
Сообщение от NovichokJS
|
А эта обёртка обязательна в данном случае?
|
скрипт можно вставить в любое место страницы, без DOMContentLoaded только после элементов с которыми скрипт работает.
|
|
10.07.2022, 14:59
|
Профессор
|
|
Регистрация: 25.04.2022
Сообщений: 159
|
|
ясно. А как отсортировать выполненные(перечеркнутые таски)? чтобы те, которые чекаем спускались в самый вниз. Понимаю что надо наверное как-то сортануть массив lis, вызвав метод sort(), но как именно что и куда вставить не получается у меня
|
|
10.07.2022, 15:03
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
NovichokJS,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<script>
alert(document.body ? "тело страницы создано" : "тело страницы отсутствует");
</script>
</head>
<body>
<script>
alert(document.body ? "тело страницы создано" : "тело страницы отсутствует");
</script>
</body>
</html>
|
|
|
|