只有当另外两个复选框未选中时,才取消选中复选框
Jquery, Uncheck checkbox only if two other checkboxes are unchecked
在我的网站中,用户可以创建'联系人类别','项目类别',并可以决定哪个联系人类别与哪个项目类别相关联。多个项目类别可以与一个联系人类别相关联,反之亦然。
https://jsfiddle.net/vuuxn5gf/这是HTML代码。
<h1>
New Contact
</h1>
<input type="checkbox" value="1" id="user_name">Contact category 1<br>
<input type="checkbox" value="2" id="user_name">Contact category 2<br>
<input type="checkbox" value="3" id="user_name">Contact category 3<br><br>
<input type="checkbox" value="a" id="user_name">Item category a<br>
<input type="checkbox" value="b" id="user_name">Item category b<br>
<input type="checkbox" value="c" id="user_name">Item category c
和JQuery
var chk1 = $("input[type='checkbox'][value='1']");
var chk2 = $("input[type='checkbox'][value='2']");
var chk3 = $("input[type='checkbox'][value='3']");
var chka = $("input[type='checkbox'][value='a']");
var chkb = $("input[type='checkbox'][value='b']");
var chkc = $("input[type='checkbox'][value='c']");
chk1.on('change', function() {
chka.prop('checked', this.checked);
chkb.prop('checked', this.checked);
});
chk2.on('change', function() {
chkb.prop('checked', this.checked);
});
chk3.on('change', function() {
chka.prop('checked', this.checked);
chkc.prop('checked', this.checked);
});
在本例中,联系人类别1与项目类别a &B,接触类别2与项目类别B相关联,接触类别3与项目类别a相关联;c .
SITUATION:用户添加新联系人。用户将新联系人放入联系人类别1 &2. 这样,项目类别a &b通过JQuery代码激活get。
问题:如果用户取消选中联系人类别1,则两个类别a &B被停用了。而项目类别b仍然应该被选中,因为联系人类别2仍然被选中。
旁注:在实践中,这将不仅仅是3个类别。但是在更大的范围内,所以我希望这个问题可以用类似的东西来解决。
chk1.on('checked', function() {
chka++;
chkb++;
if (chka > 0) chka.prop('change', this.checked);
});
chk1.on('unchecked', function() {
chka--;
chkb--;
if (chka > 0) chka.prop('change', this.checked);
});
当前代码的一个问题是,对联系人类别和项目类别之间关系的唯一引用是在处理更改事件的每个函数中。
使用此方法,联系人类别1无法检查联系人类别2与项目类别b之间是否存在链接。
您将需要创建一些变量来保存这些关系,然后在每个更改事件中检查可能影响项目类别是否应该更改的其他关系。
我修改了你的小提琴:https://jsfiddle.net/vuuxn5gf/3/
我做了一个矩阵来表示不同类别之间的关系。这只是一个例子,你可以用另一种方式来表示矩阵,但我是这样定义它的:
var icats = [];
icats['a'] = ['1','3'];
icats['b'] = ['1','2'];
icats['c'] = ['3'];
然后我创建了一个函数来处理联系人类别更改事件,对于每个事件,都要通过项目类别复选框,对于每个事件,在矩阵上执行检查,以处理是否检查了其他联系人类别
$("#contact-cats input:checkbox").on('change', function(){
var idx = $(this).val();
$("#item-cats input:checkbox").each(function(){
var itm = $(this).val();
var arr = icats[itm];
var skipChange = false;
var makeChange = false;
for(var i=0;i<arr.length;i++){
if(arr[i] != idx){
skipChange = $("#contact-cats input:checkbox[value="+arr[i]+"]").prop("checked");
}else{
makeChange = true;
}
}
if(makeChange && !skipChange){
$(this).prop("checked", !$(this).prop("checked"));
}
});
});
我承认这不是最干净的,但我希望它能让你明白你自己的解决方案所需要的思想。
我更新了你的id是唯一的,并添加了一个'redoit'函数,在你取消勾选后重新应用选中的状态,例如取消勾选cb1,而cb2被选中。为了简洁,我也去掉了变量。我希望这对你有帮助!
HTML:<h1>
New Contact
</h1>
<input type="checkbox" value="1" id="cb1">Contact category 1
<br>
<input type="checkbox" value="2" id="cb2">Contact category 2
<br>
<input type="checkbox" value="3" id="cb3">Contact category 3
<br>
<br>
<input type="checkbox" value="a" id="cba">Item category a
<br>
<input type="checkbox" value="b" id="cbb">Item category b
<br>
<input type="checkbox" value="c" id="cbc">Item category c
jQuery: $("#cb1").on('change', function() {
$("#cba").prop('checked', this.checked);
$("#cbb").prop('checked', this.checked);
redoit();
});
$("#cb2").on('change', function() {
$("#cbb").prop('checked', this.checked);
redoit();
});
$("#cb3").on('change', function() {
$("#cba").prop('checked', this.checked);
$("#cbc").prop('checked', this.checked);
redoit();
});
function redoit() {
if ($("#cb1").is(':checked')) {
$("#cba").prop('checked', true);
$("#cbb").prop('checked', true);
}
if ($("#cb2").is(':checked')) {
$("#cbb").prop('checked', true);
}
if ($("#cb3").is(':checked')) {
$("#cba").prop('checked', true);
$("#cbc").prop('checked', true);
}
};
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 使用Jquery选择或取消选择ListView中的所有复选框
- 使用jquery选中/取消选中单个复选框
- 使用javascript在页面加载时取消选中所有复选框
- (取消)使用单独的复选框激活复选框列表
- jQuery-取消选中复选框
- 单击或取消选中复选框时,如何创建弹出的自定义窗口
- Javascript选中/取消选中所有复选框并将值写入文本区域
- dojo/cbtree取消选中所有复选框并选中选中复选框
- 通过选中和取消选中复选框来添加和删除数组中的值
- 当与之关联的 ng-model 为 false 时,Angularjs 复选框值不会取消选中
- 如何通过jQuery选中所有复选框并在单击一个复选框时取消选择
- 使用Javascript根据组中的值选中或取消选中复选框
- 选中和取消选中 JavaScript 中的复选框
- 可以't取消选中该复选框(取消选中复选框时隐藏内容)
- 在复选框取消选中事件中从HTML下拉列表中删除项目
- 如何使用复选框取消选中来清除单选按钮
- 复选框取消单击事件Javascript
- 选中复选框(取消)时显示另一个文本
- Javascript复选框取消选中其他复选框,反之亦然