javascript - 如何选择所有父复选框?

标签 javascript html jquery

<分区>

我对 Javascript/Jquery 还是很陌生,到目前为止了解得很少,但我需要为我的网站提供一个功能。 (我确定这很容易,但是是的,到目前为止我还没有得出任何结果 xD)

所以我的问题:

我有一个带有复选框列表的表单,所有这些都显示在 TreeView 中。 我从 here 得到 TreeView .

所以我的结构与 w3schools.com 页面完全一样,具有相同的 css 和 javascript,唯一的区别是我有一个带复选框的表单而不是普通文本,这里我创建了一个示例:

var toggler = document.getElementsByClassName("caret");
var i;

for (i = 0; i < toggler.length; i++) {
  toggler[i].addEventListener("click", function() {
    this.parentElement.querySelector(".nested").classList.toggle("active");
    this.classList.toggle("caret-down");
  });
}
/* Remove default bullets */
ul, #myUL {
  list-style-type: none;
}

/* Remove margins and padding from the parent ul */
#myUL {
  margin: 0;
  padding: 0;
}

/* Style the caret/arrow */
.caret {
  cursor: pointer;
  user-select: none; /* Prevent text selection */
}

/* Create the caret/arrow with a unicode, and style it */
.caret::before {
  content: "\25B6";
  color: black;
  display: inline-block;
  margin-right: 6px;
}

/* Rotate the caret/arrow icon when clicked on (using JavaScript) */
.caret-down::before {
  transform: rotate(90deg);
}

/* Hide the nested list */
.nested {
  display: none;
}

/* Show the nested list when the user clicks on the caret/arrow (with JavaScript) */
.active {
  display: block;
}
<ul id="myUL">
  <li><span class="caret"></span><input type="checkbox" value="xyz" name="xyz">Beverages
    <ul class="nested">
      <li><input type="checkbox" value="xyz" name="xyz">Water</li>
      <li><input type="checkbox" value="xyz" name="xyz">Coffee</li>
      <li><span class="caret"></span><input type="checkbox" value="xyz" name="xyz">Tea
        <ul class="nested">
          <li><input type="checkbox" value="xyz" name="xyz">Black Tea</li>
          <li><input type="checkbox" value="xyz" name="xyz">White Tea</li>
          <li><span class="caret"></span><input type="checkbox" value="xyz" name="xyz">Green Tea
            <ul class="nested">
              <li><input type="checkbox" value="xyz" name="xyz">Sencha</li>
              <li><input type="checkbox" value="xyz" name="xyz">Gyokuro</li>
              <li><input type="checkbox" value="xyz" name="xyz">Matcha</li>
              <li><input type="checkbox" value="xyz" name="xyz">Pi Lo Chun</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

我现在想要的是:例如,如果您从我的示例中选择“Matcha”,我希望选中所有父复选框,即“Green Tea”、“Tea”和“Beverages”。

但我不知道该怎么做:(

有人能帮我吗?

最佳答案

要实现此目的,您可以遍历 DOM 以找到复选框元素,这些元素是选中框的父元素的子元素。

当您使用 jQuery 标记问题时,这里有一个使用该框架的解决方案:

$('.caret').on('click', e => {
  let $target = $(e.target);
  $target.parent().children('.nested').toggleClass('active');
  $target.toggleClass('caret-down');
});

$(':checkbox').on('change', e => {
  if (e.target.checked) {
    $(e.target).parentsUntil('#myUL').children(':checkbox').prop('checked', true);
  }
});
ul,
#myUL {
  list-style-type: none;
}

#myUL {
  margin: 0;
  padding: 0;
}

.caret {
  cursor: pointer;
  user-select: none;
}

.caret::before {
  content: "\25B6";
  color: black;
  display: inline-block;
  margin-right: 6px;
}

.caret-down::before {
  transform: rotate(90deg);
}

.nested {
  display: none;
}

.active {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="myUL">
  <li><span class="caret"></span><input type="checkbox" value="xyz" name="xyz">Beverages
    <ul class="nested">
      <li><input type="checkbox" value="xyz" name="xyz">Water</li>
      <li><input type="checkbox" value="xyz" name="xyz">Coffee</li>
      <li>
        <span class="caret"></span>
        <input type="checkbox" value="xyz" name="xyz">Tea
        <ul class="nested">
          <li><input type="checkbox" value="xyz" name="xyz">Black Tea</li>
          <li><input type="checkbox" value="xyz" name="xyz">White Tea</li>
          <li>
            <span class="caret"></span>
            <input type="checkbox" value="xyz" name="xyz">Green Tea
            <ul class="nested">
              <li><input type="checkbox" value="xyz" name="xyz">Sencha</li>
              <li><input type="checkbox" value="xyz" name="xyz">Gyokuro</li>
              <li><input type="checkbox" value="xyz" name="xyz">Matcha</li>
              <li><input type="checkbox" value="xyz" name="xyz">Pi Lo Chun</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

关于javascript - 如何选择所有父复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67017914/

相关文章:

javascript - 当我点击页面底部时,使用 magicscroll 和 greensock 完成的每个更改都会重置

javascript - 发送文本到文本区域

html - CSS 列表项奇怪的定位

php - 将 session 变量传递给 javascript

javascript - .apply 和 .call 有什么区别

javascript - 如何删除存储在本地存储中的数据?

c# - 如何检测 Http 请求的结束?

javascript - 是否有一个 Javascript 事件可以根据用户输入不断更新 DOM?

javascript - 在有 span 的按钮组中添加父 div

javascript - 继承和原型(prototype)链在 JS 中是如何工作的