注意:我开始为这个问题的副本写这个答案,并意识到我不能发布这个,所以我把它贴在这里。在这个答案中,表结构不同并且简化了很多。
让我们从一个带有复选框列的非常简单的表格开始:
<table>
<thead>
<tr>
<th scope='col' id='toggler'>
<input type='checkbox' id='toggleAll'>
<label for='toggleAll'>Select all</label>
</th>
<th scope='col'>A column</th>
</tr>
</thead>
<tbody>
<tr>
<td headers='toggler'>
<input type='checkbox'>
</td>
<td>some cell data</td>
</tr>
<tr>
<td headers='toggler'>
<input type='checkbox'>
</td>
<td>some cell data</td>
</tr>
<tr>
<td headers='toggler'>
<input type='checkbox'>
</td>
<td>some cell data</td>
</tr>
<tr>
<td headers='toggler'>
<input type='checkbox'>
</td>
<td>some cell data</td>
</tr>
<tr>
<td headers='toggler'>
<input type='checkbox'>
</td>
<td>some cell data</td>
</tr>
</tbody>
</table>
在这里,我在标题中有一个复选框以及一个用于可访问性目的的标签(如果您愿意,您可以隐藏标签)。
我还为标题单元格提供了一个 ID,并为元素使用了headers
属性。这对于我们正在做的事情并不是绝对必要的,但是使用该属性td
似乎是一个合适的情况。headers
如果您想将复选框移动到某些行的另一列,您只需将headers
属性添加到该单元格即可。
下面是一些 JavaScript 代码:
$('#toggleAll').change(function () {
$('td[headers~="toggler"] > input[type="checkbox"]').prop('checked', $(this).prop('checked'));
});
我们将一个函数绑定到change
标题中的复选框的事件。
选择器将在属性中以空格分隔的标记列表中查找作为td
包含 ID的元素的子元素的所有复选框。toggler
headers
该.prop()
方法设置复选框的checked
属性以匹配checked
标题中的复选框(“this”)的属性值。
我们的基本功能在这里完成。
不过,我们可以通过更改顶部复选框的状态以匹配行中复选框的状态来进行改进。
标题复选框的状态应为:
- 如果选中 0,则未选中
- 确定是否检查 (0,
n
)
- 已检查 是否
n
已检查
其中n
表示所有复选框。
为此,我们将一个函数绑定到change
表行中每个框的事件:
$('td[headers~="toggler"] > input[type="checkbox"]').change(function() {
var allChecked = true, noneChecked = true;
var headerCheckbox = $('#toggleAll');
$('td[headers~="toggler"] > input[type="checkbox"]').each(function(i, domElement) {
if(domElement.checked) {
// at least one is checked
noneChecked = false;
} else {
// at least one is unchecked
allChecked = false;
}
});
if(allChecked) {
headerCheckbox.prop('checked', true);
headerCheckbox.prop('indeterminate', false);
} else if (noneChecked) {
headerCheckbox.prop('checked', false);
headerCheckbox.prop('indeterminate', false);
} else {
headerCheckbox.prop('indeterminate', true);
}
});
我在.each()
这里使用循环遍历所有适当的复选框,以确定是否选中了全部、无或某些。
请参阅jsFiddle 演示。
希望这会有所帮助,我在回答问题时确实学到了很多东西!