javascript 切换多个复选框/函数和参数使用:如何?

问题描述 投票:0回答:1

我(至少)不熟悉 JavaScript,我需要它来相互切换多个复选框。 我从那个stackoverflow问题中获取了一段代码,效果很好!

var checkAll = document.getElementById("id_check_uncheck_all");
checkAll.addEventListener("change", function() {
  var checked = this.checked;
  var otherCheckboxes = document.querySelectorAll(".toggleable");
  [].forEach.call(otherCheckboxes, function(item) {
    item.checked = checked;
  });
});
<body>
  <label for="id_check_uncheck_all">Select All</label>
  <input type="checkbox" name="check_uncheck_all" value="false" id="id_check_uncheck_all">
  <br/>
  <input type="checkbox" name="checkBox1" value="checked1" class="toggleable">
  <input type="checkbox" name="checkBox2" value="checked2" class="toggleable">
  <input type="checkbox" name="checkBox3" value="checked3" class="toggleable">
</body>

但是... 我需要在我的页面(和网站)中将它用于更多组,我想知道如何打开一个函数,该函数将使用“this”和主复选框上所需的类参数,例如:

function checkAllBox(ref, classname) {
  var checkAll = document.getElementById(ref);
  checkAll.addEventListener("change", function() {
    var checked = this.checked;
    var otherCheckboxes = document.querySelectorAll(classname);
    [].forEach.call(otherCheckboxes, function(item) {
      item.checked = checked;
    });
  });
};
<body>

  <label for="id_check_uncheck_all">Select All</label>
  <input type="checkbox" name="check_uncheck_all" value="false" id="id_check_uncheck_all" onclick="checkAllBox('id_check_uncheck_all','toggleable')">
  <br/>

  <input type="checkbox" name="checkBox1" value="checked1" class="toggleable">
  <input type="checkbox" name="checkBox2" value="checked2" class="toggleable">
  <input type="checkbox" name="checkBox3" value="checked3" class="toggleable">

</body>

我还有一个功能也很好用,但是使用复选框目标名称而不是复选框目标类,这可能会与其他 php 方法混淆:

    <script type="text/javascript">
        function checkAllBox(ref, name) {
          var form = ref;

          while (form.parentNode && form.nodeName.toLowerCase() != 'form') { form = form.parentNode; }

          var elements = form.getElementsByTagName('input');

          for (var i = 0; i < elements.length; i++) {
            if (elements[i].type == 'checkbox' && elements[i].name == name) {
              elements[i].checked = ref.checked;
            }
          }
        }
    </script>

我尝试了很多修改,但似乎都不起作用(但由于我缺乏 JavaScript 知识,我对自己的尝试感到盲目)...我的“灵感”stackoverflow 页面上的评论建议这样做,但我无法达到这个性能...

有人可以帮助我吗?

javascript html checkbox
1个回答
1
投票

如果所有子项也都被选中/取消选中,您可能希望从容器中进行委托并选中/取消选中全部。

大量注释和“额外”代码来显示代码部分中的内容/内容。

自从您询问“this”以来,我注释掉了代码的一部分,但此处未使用。

var checkAll = document
  .querySelectorAll('.checkbox-container input[type="checkbox"]')
  .forEach((checkbox) => {
    checkbox.addEventListener("change", function(event) {
      let checkTarget = event.currentTarget;
      //let checkThis = this;
      // always true: console.log(checkThis == checkTarget);

      let container = checkTarget.closest('.checkbox-container');
      let checkAll = container.querySelector(".check-all"); //assumes ONE checkall per container
      let haveCheckedAll = checkTarget == checkAll;
      let isAllChecked = checkAll.checked;
      let otherCheckboxes = [...container.querySelectorAll('input[type="checkbox"].toggleable')];
      if (!haveCheckedAll) {
        let areAllDetailedChecked = otherCheckboxes.filter((item) => {
          return item.checked;
        }).length == otherCheckboxes.length;
        checkAll.checked = areAllDetailedChecked;
      } else {
        otherCheckboxes.forEach((item) => {
          item.checked = isAllChecked;
        });
      }
    });
  });
.checkbox-container,
.check-all-container {
  border: 1px solid #00FF00;
}

.checkbox-container {
  border-color: #0000ff;
  margin: 1em;
  }
<body>
  <div class="checkbox-container">First
    <div class="check-all-container">
      <label for="id_check_uncheck_all">Select All</label>
      <input class="check-all" type="checkbox" name="check_uncheck_all" value="false" id="id_check_uncheck_all">
    </div>
    <input type="checkbox" name="checkBox1" value="checked1" class="toggleable">
    <input type="checkbox" name="checkBox2" value="checked2" class="toggleable">
    <input type="checkbox" name="checkBox3" value="checked3" class="toggleable">
  </div>
  <div class="checkbox-container">Second
    <div class="check-all-container">
      <label for="check_uncheck_allTwo">Select All</label>
      <input class="check-all" type="checkbox" name="check_uncheck_allTwo" value="false" id="check_uncheck_allTwo">
    </div>
    <input type="checkbox" name="checkBox1" value="checked1" class="toggleable">
    <input type="checkbox" name="checkBox2" value="checked2" class="toggleable">
    <input type="checkbox" name="checkBox3" value="checked3" class="toggleable">
  </div>
</body>

© www.soinside.com 2019 - 2024. All rights reserved.