我正在尝试根据复选框的选择启用和禁用复选框。如果你看看我的代码的实时版本 http://jsfiddle.net/prady/VZ4yW/3/
我想要的是在同一行中不能选择2个复选框,并且在同一列中不能选择2个复选框。查看链接可能会让您清楚地了解我想要的内容。
在“更改此参数”和“为此参数生成模拟值”列中只能选中一个复选框,但两者都不能属于同一行。
以防您无法查看此处的链接是代码
<table>
<tr>
<td></td>
<td></td>
<td>Change this parameter</td>
<td>Generate simulated value for this param</td>
</tr>
<tr>
<td>Project cost</td>
<td><input type ="text" id ="pc"/></td>
<td><input class="change" type="checkbox" name="chkBox" id="chkBox"></input></td>
<td><input class="sim" type="checkbox" name="chkBox1" id="chkBox1"></input></td>
</tr>
<tr>
<td>Avg hours</td>
<td><input type ="text" id ="avghrs"/></td>
<td><input class="change" type="checkbox" name="chkBoxa" id="chkBoxa"></input></td>
<td><input class="sim" type="checkbox" name="chkBox1a" id="chkBox1a"></input></td>
</tr>
<tr>
<td>Project completion date</td>
<td><input type ="text" id ="cd"/></td>
<td><input class="change" type="checkbox" name="chkBoxb" id="chkBoxb"></input></td>
<td><input class="sim" type="checkbox" name="chkBox1b" id="chkBox1b"></input></td>
</tr>
<tr>
<td>Hourly rate</td>
<td><input type ="text" id ="hr"/></td>
<td><input class="change" type="checkbox" name="chkBoxc" id="chkBoxc"></input></td>
<td><input class="sim" type="checkbox" name="chkBox1c" id="chkBox1c"></input></td>
</tr>
</table>
<script type="text/javascript">
$(document).ready(function(){
$('#chkBox').click(function(){
var paramChangeBoxes = $('input:checkbox.change');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBox1').attr('disabled', 'disabled');
$('#chkBox').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1').removeAttr('disabled');
}
});
$('#chkBoxa').click(function(){
var paramChangeBoxes = $('input:checkbox.change');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBox1a').attr('disabled', 'disabled');
$('#chkBoxa').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1a').removeAttr('disabled');
}
});
$('#chkBoxb').click(function(){
var paramChangeBoxes = $('input:checkbox.change');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBox1b').attr('disabled', 'disabled');
$('#chkBoxb').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1b').removeAttr('disabled');
}
});
$('#chkBoxc').click(function(){
var paramChangeBoxes = $('input:checkbox.change');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBox1c').attr('disabled', 'disabled');
$('#chkBoxc').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1c').removeAttr('disabled');
}
});
$('#chkBox1').click(function(){
var paramChangeBoxes = $('input:checkbox.sim');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBox').attr('disabled', 'disabled');
$('#chkBox1').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1').removeAttr('disabled');
$('#chkBox').removeAttr('disabled');
}
});
$('#chkBox1a').click(function(){
var paramChangeBoxes = $('input:checkbox.sim');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBoxa').attr('disabled', 'disabled');
$('#chkBox1a').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1a').removeAttr('disabled');
$('#chkBoxa').removeAttr('disabled');
}
});
$('#chkBox1b').click(function(){
var paramChangeBoxes = $('input:checkbox.sim');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBoxb').attr('disabled', 'disabled');
$('#chkBox1b').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1b').removeAttr('disabled');
$('#chkBoxb').removeAttr('disabled');
}
});
$('#chkBox1c').click(function(){
var paramChangeBoxes = $('input:checkbox.sim');
if ($(this).is(':checked')) {
paramChangeBoxes.attr('disabled', 'disabled');
$('#chkBoxc').attr('disabled', 'disabled');
$('#chkBox1c').removeAttr('disabled');
}
else
{
paramChangeBoxes.removeAttr('disabled');
$('#chkBox1c').removeAttr('disabled');
$('#chkBoxc').removeAttr('disabled');
}
});
});
</script>
答案 0 :(得分:2)
您需要存储busyRows和busyCols,并将row和col attr添加到复选框; 在每次更改事件后更新它们,然后更新禁用的属性。
function getCB_x(elt) { return elt.parentNode.cellIndex; }
function getCB_y(elt) { return elt.parentNode.parentNode.rowIndex; }
$(document).ready(function(){
var busyRows = [], busyCols = [];
var checkboxes = $("table input[type=checkbox]");
// get topleft checkbox
var firstCb = checkboxes[0];
// and calculate its offsets
var colOffset = getCB_x(firstCb);
var rowOffset = getCB_y(firstCb)
// get bottomright checkbox
var lastCb = checkboxes.last()[0];
// calculate offsets and init busy flags
for (var i = getCB_x(lastCb) - colOffset; i >=0; i--) busyCols[i] = false;
for (var i = getCB_y(lastCb) - rowOffset; i >=0; i--) busyRows[i] = false;
// define callback
function updateCB(){
var col = getCB_x(this) - colOffset;
var row = getCB_y(this) - rowOffset;
// set corresponding row and col as "busy"
busyRows[row] = this.checked;
busyCols[col] = this.checked;
// update column with current checkbox
for (var r = 0; r < busyRows.length; r++) {
cb = checkboxes[r*busyCols.length+col];
if ((busyRows[r] || busyCols[col]) && !cb.checked) {
$(cb).attr('disabled', 'disabled');
} else {
$(cb).removeAttr('disabled', 'disabled');
}
}
// update row with current checkbox
for (var c = 0; c < busyCols.length; c++) {
cb = checkboxes[row*busyCols.length+c];
if ((busyRows[row] || busyCols[c]) && !cb.checked) {
$(cb).attr('disabled', 'disabled');
} else {
$(cb).removeAttr('disabled', 'disabled');
}
}
}
// update state for already set items
for (var i = 0; i < checkboxes.length; i++) {
var cb = checkboxes[i];
if (cb.checked) updateCB.call(cb);
}
// assign onlick handler
checkboxes.click(updateCB);
});
此代码适用于任何常规密集的复选框。 常规表示每行应具有相同数量的复选框,每列应具有相同数量的复选框。 密集意味着在带有复选框的行之间不应该有没有chekcbox的行。列相同。
如果您在表格中有其他复选框(不应包含在网格中),请为它们添加一些类(例如“非网格”)并仅选择cb不含该类:
var checkboxes = $("table input[type=checkbox]:not(.non-grid)");