Как проверить все дочерние флажки

Я использую тип поля cmb2 таксономия_multicheck_hierarchical для отображения своих категорий в иерархическом формате, однако у меня много терминов, и в настоящее время они находятся на 3 уровнях в иерархии.

Я хотел бы проверить все дочерние термины, если отмечен родительский термин, и снять отметку со всех дочерних терминов, если родительский термин не отмечен.

Ниже приведена часть отображаемого html, с которой мне нужно работать:

<ul class = "cmb2-checkbox-list cmb2-list">
  <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location1" value = "england" data-hash = "6u5db7f23u40"> <label for = "supplier_location1">England</label></li>
  <li class = "cmb2-indented-hierarchy">
    <ul>
      <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location2" value = "east-midlands" data-hash = "6u5db7f23u40"> <label for = "supplier_location2">East Midlands</label></li>
      <li class = "cmb2-indented-hierarchy">
        <ul>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location3" value = "derbyshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location3">Derbyshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location4" value = "leicestershire" data-hash = "6u5db7f23u40"> <label for = "supplier_location4">Leicestershire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location5" value = "lincolnshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location5">Lincolnshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location6" value = "northhamptonshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location6">Northhamptonshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location7" value = "rutland" data-hash = "6u5db7f23u40"> <label for = "supplier_location7">Rutland</label></li>
        </ul>
      </li>
      <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location8" value = "east-of-england" data-hash = "6u5db7f23u40"> <label for = "supplier_location8">East of England</label></li>
      <li class = "cmb2-indented-hierarchy">
        <ul>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location9" value = "bedfordshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location9">Bedfordshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location10" value = "cambridgeshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location10">Cambridgeshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location11" value = "essex" data-hash = "6u5db7f23u40"> <label for = "supplier_location11">Essex</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location12" value = "hertfordshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location12">Hertfordshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location13" value = "norfolk" data-hash = "6u5db7f23u40"> <label for = "supplier_location13">Norfolk</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location14" value = "suffolk" data-hash = "6u5db7f23u40"> <label for = "supplier_location14">Suffolk</label></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location15" value = "scotland" data-hash = "6u5db7f23u40"> <label for = "supplier_location15">Scotland</label></li>
</ul>

Код javascript, который я попытался, выглядит следующим образом:

jQuery( document ).ready(function( $ ) {

    $('#supplier_location_container input[type = "checkbox"]').click(function(){
        $('input[type = "checkbox"]', $(this).closest('li').next()).prop( 'checked', true );
    });

    $('#supplier_location_container input[type = "checkbox"]:checked').click(function(){
        $('input[type = "checkbox"]', $(this).closest('li').next()).prop( 'checked', false );
    });


});

Однако мой код содержит много ошибок! это не позволяет мне снять все дочерние поля, когда я снова проверяю родительский элемент, а также, когда вы устанавливаете любой флажок на последнем уровне в глубине иерархии, он также устанавливает флажок рядом с ним на том же уровне!

ОБНОВИТЬ:

Я чувствую, что делаю успехи, но я еще не спокоен. Мой новый код позволяет мне проверять все дочерние флажки из родительского флажка, однако, если я попытаюсь установить какой-либо флажок внутри последнего уровня в глубине моей иерархии, он всегда будет проверять флажок непосредственно под ним. Например, если вы отметите чекбокс с идентификатором supplier_location3, он также проверит supplier_location 4!

$('#supplier_location_container input[type = "checkbox"]').click(function(){

        if ($(this).is(':checked')){
            $('input[type = "checkbox"]', $(this).closest('li').next()).prop( 'checked', true );
        }else{
            $('input[type = "checkbox"]', $(this).closest('li').next()).prop( 'checked', false );
        }


    });
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что все ваши целевые флажки имеют класс cmb2-option, а элементы списка, считающиеся родительскими (или нижним уровнем иерархии), не должны иметь класса cmb2-indented-hierarchy, и ожидается, что они будут устанавливать/снимать дочерние флажки в пределах непосредственного <li> брата, имеющего класс cmb2-indented-hierarchy, Я бы реализовал эту логику следующим образом:

$('.cmb2-option').on('click', function(){
  //grab parent checkbox state
	const checkState = this.checked;
  //grab immediate sibling of parent <li> node
	const childListItem = $(this).closest('li:not(".cmb2-indented-hierarchy")').next('li.cmb2-indented-hierarchy');
  //exit if no child list available
	if (childListItem.length == 0) return;
  //iterate through child checkboxes and adjust their state according to parent
	[...childListItem.find('.cmb2-option')].forEach(childCheckbox => childCheckbox.checked = checkState);
});
<!doctype html>
<html>
<head>
  <script type = "application/javascript" src = "https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<ul class = "cmb2-checkbox-list cmb2-list">
  <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location1" value = "england" data-hash = "6u5db7f23u40"> <label for = "supplier_location1">England</label></li>
  <li class = "cmb2-indented-hierarchy">
    <ul>
      <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location2" value = "east-midlands" data-hash = "6u5db7f23u40"> <label for = "supplier_location2">East Midlands</label></li>
      <li class = "cmb2-indented-hierarchy">
        <ul>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location3" value = "derbyshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location3">Derbyshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location4" value = "leicestershire" data-hash = "6u5db7f23u40"> <label for = "supplier_location4">Leicestershire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location5" value = "lincolnshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location5">Lincolnshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location6" value = "northhamptonshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location6">Northhamptonshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location7" value = "rutland" data-hash = "6u5db7f23u40"> <label for = "supplier_location7">Rutland</label></li>
        </ul>
      </li>
      <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location8" value = "east-of-england" data-hash = "6u5db7f23u40"> <label for = "supplier_location8">East of England</label></li>
      <li class = "cmb2-indented-hierarchy">
        <ul>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location9" value = "bedfordshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location9">Bedfordshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location10" value = "cambridgeshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location10">Cambridgeshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location11" value = "essex" data-hash = "6u5db7f23u40"> <label for = "supplier_location11">Essex</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location12" value = "hertfordshire" data-hash = "6u5db7f23u40"> <label for = "supplier_location12">Hertfordshire</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location13" value = "norfolk" data-hash = "6u5db7f23u40"> <label for = "supplier_location13">Norfolk</label></li>
          <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location14" value = "suffolk" data-hash = "6u5db7f23u40"> <label for = "supplier_location14">Suffolk</label></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><input type = "checkbox" class = "cmb2-option" name = "supplier_location[]" id = "supplier_location15" value = "scotland" data-hash = "6u5db7f23u40"> <label for = "supplier_location15">Scotland</label></li>
</ul>
</body>
</html>

Это блестяще, это сработало как шарм. Большое спасибо +1

Ahmed Al-Samarrai 11.04.2019 15:43

Другие вопросы по теме