【问题标题】:Retrieve parent child checked values as comma separated以逗号分隔检索父子检查值
【发布时间】:2019-06-07 15:24:09
【问题描述】:

我正在开发应用程序来选择基于角色的菜单。在那,我有父子复选框,我想将复选框选中的值检索为 1, 1.1, 1.2, 2, 3 但当前的 jQuery 返回为 1, 1, 2, 2 , 3.

我用谷歌搜索了很多东西,也实现了一些,但不知道父子检查值的选择。

HTML

<ul>
  <li><input class="check_box" type="checkbox" value="1">Upload
    <ul>
      <li><input class="check_box" type="checkbox" value="1">Large </li>
      <li><input class="check_box" type="checkbox" value="2">Small </li>
    </ul>
  </li>
  <li><input class="check_box" type="checkbox" value="2">Move</li>
  <li><input class="check_box" type="checkbox" value="3">Producs</li>
  <li><input class="check_box" type="checkbox" value="5">User</li>
</ul>

jQuery

$('.check_box:checked').map(function () { return this.value; }).get().join(',')

复选框选择

电流输出

1、1、2、2、3

预期输出

1、1.1、1.2、2、3

【问题讨论】:

  • 我会适当地设置input 值,这样就不需要破译任何东西,或者编写错误的数据收集脚本。 value="1"value="1.2"
  • 我已经删除了我原来的 cmets,但是要添加到 @Dbro 的评论中,如果您无法更改 value,您可以添加数据属性(data-value="1"data-value="1.2")而是使用它们
  • 因为你有一个多层次的结构,但是 map 得到 ALL OF ITEMS 没有嵌套层次。

标签: jquery html checkbox


【解决方案1】:

如果你有能力添加数据属性,那还算简单……

$(function(){
  $(".check_box").on("click", function() {
    console.clear();
    console.log($(".check_box:checked").map((i,el) => $(el).data("value")).get().join(","));
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li><input class="check_box" type="checkbox" value="1" data-value="1">Upload
    <ul>
      <li><input class="check_box" type="checkbox" value="1" data-value="1.1">Large </li>
      <li><input class="check_box" type="checkbox" value="2" data-value="1.2">Small </li>
    </ul>
  </li>
  <li><input class="check_box" type="checkbox" value="2" data-value="2">Move</li>
  <li><input class="check_box" type="checkbox" value="3" data-value="3">Producs</li>
  <li><input class="check_box" type="checkbox" value="5" data-value="5">User</li>
</ul>

但是,如果您必须坚持使用现有的 HTML……它并不完全优雅(实际上它是任何东西优雅),但以下内容将满足您的需求。 ..

它还有一个优点是你可以多重嵌套&lt;ul&gt;,它会导致1.1.1等。

$(function(){
  $(".check_box").on("click", function() {
    var values = buildValues($("#root"),"");
    if (values.length > 0) {
      values = values.substring(0, values.length - 1);
    }
    console.clear();
    console.log(values);
  });
});

function buildValues($ul,parentValue) {
  var values = "";
  // Go though each listitem
  $ul.children("li").each(function() {
    // Get the checkbox and the value
    var $chk = $(this).children().first();
    var value = $chk.val().toString();
    // If the checkbox is ticked, add the value to the string
    if ($chk.is(":checked")){
      values += parentValue + value + ",";
    }
    // See if there is another element
    var $subUL = $chk.next();
    if ($subUL.length > 0) {
      // Recurse using the current value
      values += buildValues($subUL, value + ".");
    }
  });
  return values;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="root">
  <li><input class="check_box" type="checkbox" value="1">Upload
    <ul>
      <li><input class="check_box" type="checkbox" value="1">Large </li>
      <li><input class="check_box" type="checkbox" value="2">Small </li>
    </ul>
  </li>
  <li><input class="check_box" type="checkbox" value="2">Move</li>
  <li><input class="check_box" type="checkbox" value="3">Producs</li>
  <li><input class="check_box" type="checkbox" value="5">User</li>
</ul>

【讨论】:

  • 请注意,您使用数据属性的函数无法正常工作。日志显示所有值更改为最近选择的数字。
  • 是的,刚刚注意到自己 - 已经修复 - 但感谢报告 :-)
  • @freefaller 感谢您的精彩回答。我还需要将值绑定到复选框。你能指导我吗?
  • 抱歉,我不明白您所说的“我需要将值绑定到复选框”是什么意思
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多