【问题标题】:checkboxes within the span, select deselect范围内的复选框,选择取消选择
【发布时间】:2011-03-10 06:31:25
【问题描述】:

我通过我的 php 代码生成了以下 html。
我想要做的是,当我选择跨度“行”中的复选框时,选择包含“行”的“main_row”跨度的复选框,
应该自动检查。
此外,当我取消选择“main_row”复选框时,应取消选择“row: 复选框中包含的所有内容。
为此,我可以使用 javascript 或 jquery。

<span id="mainTopHeading" >Imports &amp; Exports</span>
<span id="lblmainTopHeading">Categories</span>
<span id="main_row" class="mystyleClass" >
    <input type="checkbox" id="pH" curstomerName="Zubair & CO" recordID="1920"  />
    <span title="Zubair & CO"  id="pHName">Zubair &amp; CO</span>
    <span title="Roland">Roland</span>
</span>
<span id="row"  recordID="1920"  curstomerName="Zubair & CO"   >
    <input type="checkbox"  recordID="1920" curstomerName="Zubair & CO"  />
    <span>Order  Rice &amp; Sugar</span>
    <span>Roland</span>
</span>

<span id="mainTopHeading" >Manufacturing</span>
<span id="lblmainTopHeading">Categories</span>

<span id="main_row" class="mystyleClass" >
    <input type="checkbox" id="pH" curstomerName="Howard Manufacturing" recordID="1870"  />
    <span title="Howard Manufacturing"  id="pHName">Howard Manufacturing</span>
    <span title="Roland"> Roland</span>
</span>
<span id="row" index="1" recordID="1870"  curstomerName="Howard Manufacturing"  >
    <input type="checkbox" style="left:10;" recordID="1870"  curstomerName="Howard Manufacturing" />
    <span>Order Tires and Plastic products</span>
    <span>Roland</span>
</span>
<span id="row" index="1" recordID="1870"  curstomerName="Howard Manufacturing"  >
    <input type="checkbox" style="left:10;" recordID="1870"  curstomerName="Howard Manufacturing" />
    <span>Order Electronics</span>
    <span>Roland</span>
</span>

<span id="main_row" class="mystyleClass"  >
    <input type="checkbox" id="pH" curstomerName="James & Sons" recordID="1866"  />
    <span title="James & Sons"  id="pHName">James &amp; Sons</span>
    <span title="Roland">Roland</span>
</span>
<span id="main_row" class="mystyleClass"  >
    <input type="checkbox" id="pH" curstomerName="Villa Thresa Inc" recordID="1866"  />
    <span title="Villa Thresa Inc"  id="pHName">Villa Thresa Inc</span>
    <span title="Roland">Roland</span>
</span>
<span id="main_row" class="mystyleClass"  >
    <input type="checkbox" id="pH" curstomerName="Bangkok Manufacturing" recordID="1866"  />
    <span title="Bangkok Manufacturing"  id="pHName">Bangkok Manufacturing</span>
    <span title="Roland">Roland</span>
</span>

<span id="row"  recordID="1920"  curstomerName="Zubair & CO"   >
    <input type="checkbox"  recordID="1920" curstomerName="Zubair & CO"  />
    <span>Order  Rice &amp; Sugar</span>
    <span>Roland</span>
</span>

<span id="mainTopHeading">Misc.</span>
<span id="lblmainTopHeading">Different things</span>
<span id="main_row" class="mystyleClass"  >
    <input type="checkbox" id="pH" curstomerName="Bangkok Manufacturing" recordID="1866"  />
    <span title="Bangkok Manufacturing"  id="pHName">Bangkok Manufacturing</span>
    <span title="Roland">Roland</span>
</span>​

【问题讨论】:

  • 您有多个具有相同 ID 的元素,例如 main_rowrow。这是无效的,因为 ID 必须是唯一的,并且不能在同一页面上重复使用。这可能会导致问题。
  • 此外,您的&lt;span&gt; 元素与row ID(应该是一个类)似乎没有包含在main_row 中,正如您的问题所暗示的那样。
  • 它们是通过 php 生成的,所以可能有几个实例。我可以添加一个 class="main_row" 和一个 class="row"。如果我这样做了,那我们该如何解决呢?谢谢
  • 您的标记会遇到各种问题。如果你想要一个层次关系,你的标记元素应该以这种方式布局,否则,你会给自己带来不必要的麻烦。如果您将行跨度嵌套在 main_row 跨度内,那么您的问题就有一个非常简单的答案。另外,如果您可以更改/向元素添加一个类,您应该可以更改 id 对吗?

标签: javascript jquery javascript-events


【解决方案1】:

一旦您将id 更改为class 更改上面的@patrick 建议,您可以这样做:

$(".main_row :checkbox").change(function() {
  $(this).closest(".main_row").nextUntil(".main_row")
         .find(":checkbox").attr("checked", this.checked);
});

You can try a demo here,当您选中/取消选中.main_row 中的复选框时,它会上升到它所在的.main_row,使用.nextUntil(".main_row") 获取单击的.main_row 和之间的所有&lt;span&gt; 元素下一个,所以这个类。然后它会在其中获取任何复选框并将其checked 属性设置为与您单击的.main_row 中的复选框相同。

如果里面可能有.row以外的东西,你可以在.nextuntil()之后添加.filter(".row"),将其限制为.row元素。

【讨论】:

  • 当我选择 span "row"' 中的复选框时,我认为 OP 希望触发器位于 checkbox 下的 .row: ' 上。。所以你需要先回溯到.main_row。我仍然认为这个问题意味着不存在的嵌套。在我查看 CSS 并意识到您使用了 nextUntil() 之前,您的示例真的让我很头疼。 :o)
  • 您好 Nick Craver 非常感谢您,但它的工作方式正好相反。我想要的是当我检查子复选框时,它应该检查主复选框并且没有检查子复选框,然后不应该检查主复选框。你能告诉我怎么做吗。再次感谢
  • @user295189 - 你的意思是这样吗? jsfiddle.net/rzwzF/2 仍然试图准确地掌握你所追求的 :)
  • 尼克·克拉弗,差不多!唯一的问题是,如果没有子复选框,它不会让我选择。如果没有子复选框,我仍然希望能够选择。谢谢百万
  • @user295189 - 在这种情况下,只需删除第一个设置为 disabled 的对象,如下所示:jsfiddle.net/rzwzF/3
【解决方案2】:

这是一个(我认为)可以满足您的需求的解决方案。

(以 Nick 的示例为起点。我看到 Nick 发布了类似的解决方案,但这个采用了不同的方法。)

除了您要求的以外,如果您点击.main_row 下的复选框,它将选中/取消选中所有相关的.row 复选框。

试试看: http://jsfiddle.net/nykda/

$(".row input").change(function() {
    var $row= $(this).closest(".row");
    var $main_row = $row.prev('.main_row').length ? $row.prev('.main_row') : $row.prevUntil(".main_row").prev();
    $main_row.find(":checkbox").attr("checked", function(i,attr) {
        return $main_row.nextUntil('.main_row').filter(':has(input:checked)').length ? "checked" : false;
    });
});

$(".main_row input").change(function() {
    $(this).closest(".main_row").nextUntil('.main_row').children(':checkbox').attr('checked', this.checked);
});

【讨论】:

  • +1 - 很高兴你解决了这个问题,我非常想知道为什么有人认为我们在 .Net 中需要 CookieCollection CookieContainer :-/
猜你喜欢
  • 2017-10-15
  • 2016-10-10
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2016-11-10
  • 1970-01-01
相关资源
最近更新 更多