Задать вопрос
@CreativeStory

Как разделить чекбоксы на группы?

Как можно сделать разделение чекбоксов на группы по имени?

Например, есть 2 контейнера/группы. В одном name="tseremonii", в другом name="mesto-provedeniya".
<div class="group">
        <input type="checkbox" class="input_data" name="tseremonii" onclick="onlyOne(this)" value="10">
        <input type="checkbox" class="input_data" name="tseremonii" onclick="onlyOne(this)" value="20">
        <input type="checkbox" class="input_data" name="tseremonii" onclick="onlyOne(this)" value="30">
        <input type="checkbox" class="input_data" name="tseremonii" onclick="onlyOne(this)" value="40">
    </div>
    <div class="group">
        <input type="checkbox" class="input_data" name="mesto-provedeniya" onclick="onlyOne(this)" value="50">
        <input type="checkbox" class="input_data" name="mesto-provedeniya" onclick="onlyOne(this)" value="60">
        <input type="checkbox" class="input_data" name="mesto-provedeniya" onclick="onlyOne(this)" value="70">
        <input type="checkbox" class="input_data" name="mesto-provedeniya" onclick="onlyOne(this)" value="80">
    </div>


есть код, с помощью которого эмулируется поведение радиокнопки, с возможностью выбора только одного пункта и возможностью деактивировать его(checked = false).

function onlyOne(checkbox) {
            var input_item = document.getElementsByClassName('input_data');

            for (var j = 0; j < input_item.length; j++) {
                
                var checkboxes = document.getElementsByName(input_item[j].name);


                for (var i = 0; i < checkboxes.length; i++) {
                    if (checkboxes[i] !== checkbox) checkboxes[i].checked = false;
                }
            }
            
        }


Сейчас в результате выполнения кода checked=true прыгает из идной группы в другую, и не получается выбрать в 2-х группах по пункту.
Где в коде находится ошибка?

demo
  • Вопрос задан
  • 1092 просмотра
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию + ИИ
    6 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вариант раз - принадлежность к группе устанавливается через значение атрибута name:

function onlyOne(checkbox) {
  for (const n of document.getElementsByName(checkbox.name)) {
    n.checked = n.checked && n === checkbox;
  }
}

Вариант два - принадлежность к группе устанавливается через общий контейнер; а ещё давайте исправим косяки с обработкой событий (вместо click должен быть change, инлайновое подключение обработчика - это не круто):

document.querySelectorAll('.group').forEach(function(n) {
  n.addEventListener('change', this);
}, e => e
  .currentTarget
  .querySelectorAll('input[type="checkbox"]')
  .forEach(n => n.checked = n.checked && n === e.target)
);

Вариант три - гибрид чекбокса и радиокнопки не нужен, заменяете чекбоксы радиокнопками и добавляете ещё одну, которая будет обозначать отсутствие выбора.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы