我有一个复选框网格,可以是任意数量的行或列宽(我知道这是一个糟糕的设计,但我们正在复制一个遗留系统)。
带有淡黄色背景的复选框将选中与其相邻的行或列中的所有复选框。
我通常有一些 jQuery 会为单个复选框列表执行这种操作:
$(document).ready(function () {
$('.master-checkbox').show();
$('.master-checkbox').click(function () {
$('.section-checkbox').prop('checked', this.checked);
});
$('.section-checkbox').change(function () {
var check = ($('.section-checkbox').filter(":checked").length == $('.section-checkbox').length);
$('.master-checkbox').prop("checked", check);
});
});
我可以使用上面的代码 4x 来完成我需要的工作,但是随着行和列的大小可能(将)增长,有没有人知道我可以在我的复选框中添加相同的功能而无需复制的一种好方法jQuery代码'n'次?
[编辑]
如果用一列复选框和一个主复选框来做这种事情,我会使用我包含的 jQuery 代码。
目前,我在顶部的复选框中分别指定了“master-sco-0”和“master-sco-1”类,左侧的两个复选框指定了“master-sec-0”类和'master-sec-1'。中间的4个(从左到右,从上到下)'sec-0 sco-0'、'sec-0 sco-1'、'sec-1 sco-0'和'sec-1 sco-1 '。
[编辑2]
这是问题的一个jsfiddle。
[编辑3]
这是我从 Arun 的回答中得出的最终解决方案。我进一步触发了更改事件,以确保列/行主复选框可以对其他列/行主复选框做出更改做出反应:
<script type="text/javascript">
$(document).ready(function () {
$('.cb-master-col').click(function () {
var isMasterColChecked = this.checked;
var tdMasterPosition = $(this).parent().index();
var $table = $(this).closest('table');
$table.find('td:nth-child(' + (tdMasterPosition + 1) + ') input.cb-child').each(function () {
if (this.checked != isMasterColChecked) {
$(this).prop('checked', isMasterColChecked);
$(this).trigger('change');
}
});
});
$('.cb-master-row').click(function () {
var isMasterRowChecked = this.checked;
$(this).closest('tr').find('input.cb-child').each(function () {
if (this.checked != isMasterRowChecked) {
$(this).prop('checked', isMasterRowChecked);
$(this).trigger('change');
}
});
});
$('.cb-child').change(function () {
var $tr = $(this).closest('tr')
$tr.find('input.cb-master-row').prop('checked', $tr.find('input.cb-child').not(':checked').length == 0);
var tdChildPosition = $(this).parent().index();
var $table = $(this).closest('table');
var $ths = $table.find('thead tr:nth-child(2) th:nth-child(' + (tdChildPosition + 1) + ')');
var $tds = $table.find('tbody td:nth-child(' + (tdChildPosition + 1) + ')');
$ths.find('input.cb-master-col').prop('checked', $tds.find('input.cb-child').not(':checked').length == 0)
});
});
</script>