【问题标题】:jQuery - check all/uncheck all checkboxes - then unchecking (or checking) additional onesjQuery - 选中所有/取消选中所有复选框 - 然后取消选中(或选中)其他复选框
【发布时间】:2013-10-08 17:07:38
【问题描述】:

JQuery 1.9.1 并使用 IE8 和 Firefox 作为浏览器。

我发布了一个尚未回答的问题here - 希望通过重新提出问题我可以得到答案。

下面是我在网页上显示的表格中几行的 HTML。

<tr>
    <td>
        <label for="RoomNbr2" align="right">&nbsp;&nbsp;Room No 2
            <input type="checkbox" align="left" class="checkall" id="RoomNbr2" name="RoomNbr2">
        </label>
    </td>
    <td>
        <label for="PCNbr203" align="right">&nbsp;&nbsp;203
            <input type="checkbox" align="left" id="PCNbr203" name="PCNbr203" class="RoomNbr2">
        </label>
    </td>
    <td>
        <label for="PCNbr204" align="right">&nbsp;&nbsp;204
            <input type="checkbox" align="left" id="PCNbr204" name="PCNbr204" class="RoomNbr2">
        </label>
    </td>
</tr>
<tr>
    <td>
        <label for="RoomNbr3" align="right">&nbsp;&nbsp;Room No 3
            <input type="checkbox" align="left" class="checkall" id="RoomNbr3" name="RoomNbr3">
        </label>
    </td>
    <td>
        <label for="PCNbr310" align="right">&nbsp;&nbsp;310
            <input type="checkbox" align="left" id="PCNbr310" name="PCNbr310" class="RoomNbr3">
        </label>
    </td>
    <td>
        <label for="PCNbr320" align="right">&nbsp;&nbsp;320
            <input type="checkbox" align="left" id="PCNbr320" name="PCNbr320" class="RoomNbr3">
        </label>
    </td>
    <td>
        <label for="PCNbr340" align="right">&nbsp;&nbsp;340
            <input type="checkbox" align="left" id="PCNbr340" name="PCNbr340" class="RoomNbr3">
        </label>
    </td>
    <td>
        <label for="PCNbr350" align="right">&nbsp;&nbsp;350
            <input type="checkbox" align="left" id="PCNbr350" name="PCNbr350" class="RoomNbr3">
        </label>
    </td>
</tr>

如果用户点击Room No 2,那么Room No 2 中的所有PC(分配给各个PC 的RoomNbr2 类)都会被检查。同样,如果 Room No 2 被选中然后又被取消选中,那么所有具有该类的 PC 都会效仿。

我使用这段代码来监控房间的checkall 类:

$('#mytable').on('click','.checkall', function() {
   $('input.' + this.id).prop('checked', this.checked);
   });

我使用此代码来监控表格上的单个点击:

$('#mytable').on('click', function() {
   $('input.' + this.id).prop('checked', this.checked);
    });

我需要做的是更改 2 号房间(或 3)复选框的状态,当它已被选中并且相关复选框之一变为未选中时。

例如:

如果我点击 2 号房间,2 号房间 的复选框会被选中,203204 也会被选中。

如果我取消选中 203,那么 204 应保持选中状态,而 Room No 2 的复选框将处于未选中状态(不改变 204 复选框的状态)或进入不确定状态(除了视觉上显示已选中)。

在任何给定时间,我都知道检查了哪些机器:

$("input[name*=PC]:checked").map(function () {return this.name;}).get().join(",")

这是我真正想知道的。我只是不希望 Room No 复选框在不再选中所有相关复选框时表明它们已被选中。我发现的所有示例都具有完全选中/未选中的性质。

对于如何最好地解决此问题的任何想法或方向,我们将不胜感激。

【问题讨论】:

    标签: javascript jquery html checkbox


    【解决方案1】:

    如何检查复选框的数量与选中的复选框数量,并将每行的主复选框设置为选中、未选中或不确定?

    jsFiddle example

    $('#mytable').on('click', '.checkall', function () {
        $('input.' + this.id).prop('checked', this.checked);
    });
    $('#mytable').on('click', 'input:not(.checkall)', function () {
        var total = $(this).closest('tr').find('input:not(.checkall)').length;
        var checked = $(this).closest('tr').find('input:not(.checkall):checked').length;
        if (total == checked) {
            $(this).closest('tr').find('input:first').prop('checked', true);
            $(this).closest('tr').find('input:first').prop('indeterminate', false);
        } else if (checked == 0) {
            $(this).closest('tr').find('input:first').prop('checked', false);
            $(this).closest('tr').find('input:first').prop('indeterminate', false);
        } else {
            $(this).closest('tr').find('input:first').prop('indeterminate', true);
        }
    });
    

    【讨论】:

      【解决方案2】:

      如果未全部选中,如何将复选框设置为不确定?

      $(".checkall").prop("indeterminate", true);
      

      关于这个主题的一篇不错的文章:http://css-tricks.com/indeterminate-checkboxes/

      【讨论】:

        【解决方案3】:

        这个策略怎么样?

        $('input[type=checkbox]').on('click', function() {
            var clickedCb = $(this);
            var tr = $(this).closest('tr');
            var mainCb = tr.children('td input')[0]; 
            if (clickedCb == mainCb) { // probably this check is not 100% correct.
                // do the checkall stuff
            } else {
                mainCb.prop('indeterminate', true);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 2011-06-15
          相关资源
          最近更新 更多