Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.07.2022, 13:48
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 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');
  }
});
Ответить с цитированием
  #2 (permalink)  
Старый 10.07.2022, 13:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Сообщение от NovichokJS
Как это исправить?
прочитать ответы на предыдущую тему или сделать цикл по всем li
Ответить с цитированием
  #3 (permalink)  
Старый 10.07.2022, 14:10
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 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')
Ответить с цитированием
  #4 (permalink)  
Старый 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>
Ответить с цитированием
  #5 (permalink)  
Старый 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>
Ответить с цитированием
  #6 (permalink)  
Старый 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>
Ответить с цитированием
  #7 (permalink)  
Старый 10.07.2022, 14:38
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

Рони, спасибо. А эта обёртка обязательна в данном случае? - document.addEventListener("DOMContentLoaded", function() {
такого даже не учил еще. Без нее также отработает код
Ответить с цитированием
  #8 (permalink)  
Старый 10.07.2022, 14:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Сообщение от NovichokJS
А эта обёртка обязательна в данном случае?
скрипт можно вставить в любое место страницы, без DOMContentLoaded только после элементов с которыми скрипт работает.
Ответить с цитированием
  #9 (permalink)  
Старый 10.07.2022, 14:59
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

ясно. А как отсортировать выполненные(перечеркнутые таски)? чтобы те, которые чекаем спускались в самый вниз. Понимаю что надо наверное как-то сортануть массив lis, вызвав метод sort(), но как именно что и куда вставить не получается у меня
Ответить с цитированием
  #10 (permalink)  
Старый 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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать значения группы чекбоксов etulpan Общие вопросы Javascript 2 11.02.2017 01:59
Подсчет выбранных чекбоксов, радио, текста jemlive19 Элементы интерфейса 3 08.01.2017 21:20
Подсчет количества выбранных чекбоксов и радио jemlive19 Элементы интерфейса 0 08.01.2017 18:46
Посчитать значения чекбоксов sergylt Общие вопросы Javascript 12 08.02.2016 00:34
Создание массива с id чекбоксов fi.adm Элементы интерфейса 4 17.08.2014 11:55