jquery - 许多复选框组和 "select all"

标签 jquery checkbox

我有 8 组复选框。每个组都有一个“主”和 8 到 12 个子复选框,并尝试为每个组创建“取消/全选”行为。

我发现了这个 https://stackoverflow.com/a/25697142/9098325但它只显示一组复选框。

我在这里摆弄了我不起作用的解决方案:https://jsfiddle.net/ex4rnq83/

$('.outer').on('click', function() {
  if (this.checked) {
    $('.inner').each(function() {
      this.checked = true;
    });
  } else {
    $('.inner').each(function() {
      this.checked = false;
    });
  }
});

$('.inner').on('click', function() {
  if ($(this).is(":checked")) {
    var isAllChecked = 0;

    $(".inner").each(function() {
      if (!this.checked)
        isAllChecked = 1;
    });

    if (isAllChecked == 0) {
      $(".outer").prop("checked", true);
    }
  } else {
    $(".outer").prop("checked", false);
  }
});
ul {
  list-style: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>
    <input type="checkbox" id="out1" class="outer">
    <label for="out1">Checkbox Out 1</label>
  </li>
  <ul>
    <li>
      <input type="checkbox" id="inner1" class="inner">
      <label for="out1">Checkbox Inner 1</label>
    </li>
    <li>
      <input type="checkbox" id="inner2" class="inner">
      <label for="out1">Checkbox Inner 2</label>
    </li>
    <li>
      <input type="checkbox" id="inner3" class="inner">
      <label for="out1">Checkbox Inner 3</label>
    </li>
  </ul>
  <li>
    <input type="checkbox" id="out2" class="outer">
    <label for="out1">Checkbox Out 2</label>
  </li>
  <ul>
    <li>
      <input type="checkbox" id="inner4" class="inner">
      <label for="out1">Checkbox Inner 4</label>
    </li>
    <li>
      <input type="checkbox" id="inner5" class="inner">
      <label for="out1">Checkbox Inner 5</label>
    </li>
  </ul>
</ul>

最佳答案

首先,如果您更正 HTML,使子级 ul 位于父级的 li 内,那么这会变得简单得多。选中复选框后,您可以轻松遍历 DOM 以查找子复选框并将其选中状态设置为匹配。

类似地,您可以获得同级复选框的选中状态。如果它们全部被选中,那么任何父复选框都应该被选中。像这样的事情:

$(':checkbox').on('change', function() {
  // check children
  $(this).closest('li').find(':checkbox').prop('checked', this.checked);

  // check parent if all children checked
  var $ul = $(this).closest('ul');
  var $siblings = $ul.find('> li > label > :checkbox');
  var allChecked = $siblings.length == $siblings.filter(':checked').length;
  $ul.closest('li').find('> label > :checkbox').prop('checked', allChecked);
});
ul {
  list-style: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>
    <label><input type="checkbox">Checkbox Out 1</label>
    <ul>
      <li>
        <label><input type="checkbox">Checkbox Inner 1</label>
      </li>
      <li>
        <label><input type="checkbox">Checkbox Inner 2</label>
      </li>
      <li>
        <label><input type="checkbox">Checkbox Inner 3</label>
      </li>
    </ul>
  </li>
  <li>
    <label><input type="checkbox">Checkbox Out 2</label>
    <ul>
      <li>
        <label><input type="checkbox">Checkbox Inner 4</label>
      </li>
      <li>
        <label><input type="checkbox">Checkbox Inner 5</label>
      </li>
    </ul>
  </li>
</ul>

请注意,这完全不需要任何唯一的 id 属性,因为逻辑依赖于 DOM 结构,并且 label 元素已被移动以包装它们所在的复选框相关。 innerouter 类属性也已被删除,因为它们在正确嵌套 ul/li 时变得多余。

关于jquery - 许多复选框组和 "select all",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57887464/

相关文章:

jQuery:取消选中一个复选框上的其他复选框

javascript - 将 row.add 用于带有复选框的数据表

javascript - 使用 angularjs 使用属性检查取消选中复选框

jquery - 使用jQuery获取表标题名称

jquery - 如何将 'easeOutBack' 缓动与 Velocity.js 一起使用

javascript - 使用 Codeigniter 加载多个 View 的最佳选项是什么?

javascript - 使用 JQuery 获取复选框选定状态

jquery - 使用 jQuery 获取复选框属性

jquery - 我希望我的平板电脑的硬件后退按钮 (Android) 可以关闭我网站的灯箱

javascript - 定义一个像 jQuery UI 中的 UI 元素