【问题标题】:How to unhecked parent checkbox如何取消选中父复选框
【发布时间】:2016-03-12 20:36:02
【问题描述】:

我在我的页面上有嵌套的复选框,如果我点击父复选框,子复选框被选中,到目前为止还可以。但是如果我点击子复选框,我希望父点击必须被取消选中怎么办?

html

<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>No Title</title>
    </head>
    <body>
        <div class="new-checkbox">
            <ul>
                <li>
                    <input type="checkbox" id="input1"><label for="input1">kategori 1</label>
                    <ul>
                        <li><input type="checkbox" id="input11"><label for="input11">kategori 11</label></li>
                        <li><input type="checkbox" id="input12"><label for="input12">kategori 12</label></li>
                        <li><input type="checkbox" id="input13"><label for="input13">kategori 13</label></li>
                    </ul>
                </li>
                <li><input type="checkbox" id="input2"><label for="input2">kategori 2</label></li>
                <li>
                    <input type="checkbox" id="input3"><label for="input3">kategori 3</label>
                    <ul>
                        <li><input type="checkbox" id="input31"><label for="input31">kategori 31</label></li>
                        <li><input type="checkbox" id="input32"><label for="input32">kategori 32</label></li>
                        <li>
                            <input type="checkbox" id="input33"><label for="input33">kategori 33</label>
                            <ul>
                                <li><input type="checkbox" id="input331"><label for="input331">kategori 331</label></li>
                                <li><input type="checkbox" id="input332"><label for="input332">kategori 332</label></li>
                                <li><input type="checkbox" id="input333"><label for="input333">kategori 333</label></li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
        <!--new-checkbox-->
        <script type="text/javascript" src="https://cdn.anitur.com.tr/js/jquery-1.8.2.min.js" ></script>
    </body>
</html>

css

.new-checkbox ul {
  padding: 0;
  margin: 0;
  list-style: none;
  margin-left: 30px;
  font: normal 11px/16px"Segoe UI", Arial, Sans-serif;
}
.new-checkbox ul:first-child {
  margin-left: 0;
}
.new-checkbox ul li {
  margin: 3px 0;
}
.new-checkbox input[type="checkbox"] {
  display: none;
}
.new-checkbox label {
  cursor: pointer;
}
.new-checkbox input[type="checkbox"] + label:before {
  border: 1px solid #ffffff;
  content: "\00a0";
  display: inline-block;
  font: 16px/1em sans-serif;
  height: 13px;
  width: 13px;
  margin: 2px .25em 0 0;
  padding: 0;
  vertical-align: top;
  border: solid 1px #1375b3;
  color: #1375b3;
  opacity: .50;
}
.new-checkbox input[type="checkbox"]:checked + label:before {
  background: #fff;
  color: #1375b3;
  content: "\2714";
  text-align: center;
  box-shadow: 0 0 2px rgba(0, 0, 0, .25) inset;
  opacity: 1;
}
.new-checkbox input[type="checkbox"]:checked + label:after {
  font-weight: bold;
}

jquery

$(document).ready(function() {
  $('.new-checkbox input[type=checkbox]').on("click", function() {
    if ($(this).is(':checked')) {
      // check all children
      $(this).parent().find('li input[type=checkbox]').prop('checked', true);
      // check all parents
      $(this).parent().prev().prop('checked', true);
    } else {
      // uncheck all children
      $(this).parent().find('li input[type=checkbox]').prop('checked', false);
    }
  });
});

codepen

【问题讨论】:

  • 我会考虑特别关注听众.on('change')
  • 但是逻辑上怎么办?
  • 我通过修复更新了答案。请检查。

标签: javascript jquery html css checkbox


【解决方案1】:

添加一个新的检查来查找被检查的元素是否有父元素,然后检查是否所有的子元素都被点击了。此外,最好使用change 事件。

$(document).ready(function() {
  $('.new-checkbox input[type=checkbox]').on("change", function() {
    var $close = $(this).closest('ul').closest('li');
      if ($(this).is(':checked')) {
        // check all children
        $(this).parent().find('li input[type=checkbox]').prop('checked', true);
        // check all parents
        $(this).parent().prev().prop('checked', true);
      } else {
        // uncheck all children
        $(this).parent().find('li input[type=checkbox]').prop('checked', false);
      }
    while ($close.length) {
      $che = $close.find('ul input:checkbox');
      $checked = $close.find('ul input:checkbox:checked');
      $close.children('input').prop('checked', $che.length == $checked.length);
      $close = $($close.children('input')).closest('ul').closest('li');
      console.log($che.length, $checked.length);
    }
  });
});
.new-checkbox ul {
  padding: 0;
  margin: 0;
  list-style: none;
  margin-left: 30px;
  font: normal 11px/16px"Segoe UI", Arial, Sans-serif;
}
.new-checkbox ul:first-child {
  margin-left: 0;
}
.new-checkbox ul li {
  margin: 3px 0;
}
.new-checkbox input[type="checkbox"] {
  display: none;
}
.new-checkbox label {
  cursor: pointer;
}
.new-checkbox input[type="checkbox"] + label:before {
  border: 1px solid #ffffff;
  content: "\00a0";
  display: inline-block;
  font: 16px/1em sans-serif;
  height: 13px;
  width: 13px;
  margin: 2px .25em 0 0;
  padding: 0;
  vertical-align: top;
  border: solid 1px #1375b3;
  color: #1375b3;
  opacity: .50;
}
.new-checkbox input[type="checkbox"]:checked + label:before {
  background: #fff;
  color: #1375b3;
  content: "\2714";
  text-align: center;
  box-shadow: 0 0 2px rgba(0, 0, 0, .25) inset;
  opacity: 1;
}
.new-checkbox input[type="checkbox"]:checked + label:after {
  font-weight: bold;
}
<script type="text/javascript" src="https://cdn.anitur.com.tr/js/jquery-1.8.2.min.js"></script>
<div class="new-checkbox">
  <ul>
    <li>
      <input type="checkbox" id="input1">
      <label for="input1">kategori 1</label>
      <ul>
        <li>
          <input type="checkbox" id="input11">
          <label for="input11">kategori 11</label>
        </li>
        <li>
          <input type="checkbox" id="input12">
          <label for="input12">kategori 12</label>
        </li>
        <li>
          <input type="checkbox" id="input13">
          <label for="input13">kategori 13</label>
        </li>
      </ul>
    </li>
    <li>
      <input type="checkbox" id="input2">
      <label for="input2">kategori 2</label>
    </li>
    <li>
      <input type="checkbox" id="input3">
      <label for="input3">kategori 3</label>
      <ul>
        <li>
          <input type="checkbox" id="input31">
          <label for="input31">kategori 31</label>
        </li>
        <li>
          <input type="checkbox" id="input32">
          <label for="input32">kategori 32</label>
        </li>
        <li>
          <input type="checkbox" id="input33">
          <label for="input33">kategori 33</label>
          <ul>
            <li>
              <input type="checkbox" id="input331">
              <label for="input331">kategori 331</label>
            </li>
            <li>
              <input type="checkbox" id="input332">
              <label for="input332">kategori 332</label>
            </li>
            <li>
              <input type="checkbox" id="input333">
              <label for="input333">kategori 333</label>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多