3

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

我在这里发布了一个尚未回答的问题 - 希望通过重新制定问题我可以得到答案。

下面是我在网页上显示的表格中几行的 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>

如果用户单击2 号房间,那么 2 号房间的所有 PC (RoomNbr2分配给单个 PC 的类别)都会被检查。同样,如果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应该保持选中状态, 2 号房间的复选框进入未选中状态(不更改204复选框的状态)或进入不确定状态(除了视觉上显示已选中的状态)。

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

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

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

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

4

3 回答 3

1

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

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

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

于 2013-10-08T17:20:40.397 回答
1

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

jsFiddle 示例

$('#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);
    }
});
于 2013-10-08T17:26:58.647 回答
0

这个策略怎么样?

$('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);
    }
}
于 2013-10-08T17:29:11.947 回答