javascript - Jquery 使复选框选中其他复选框删除
问题描述
我正在尝试制作一个过滤器来输出一些过滤后的结果。输出到一个数组。我有四个复选框。我几乎能够达到我想要的结果。All Levels
但是,当没有选择时,我想再次选中该复选框。这是我目前所拥有的。我是 jquery 的新手,所以我的代码一定效率不高。如果有人可以建议或改进我的代码以达到完全相同的结果,那也太好了!谢谢!
HTML
<div id="course-levels" class="list-group">
<input type="checkbox" value="all-levels" id="all-levels">
<input type="checkbox" value="degree" class="group">
<input type="checkbox" value="pgd" class="group">
<input type="checkbox" value="hnd" class="group">
</div>
jQuery
<script>
$(document).ready(function(){
// get reference to input elements
var inp = document.getElementsByTagName('input');
var levels = [];
// if checkboxes under 'group' class is not checked
if ($('input.group').prop('checked') == false) {
// make #all-levels default selected checkbox
$('#all-levels').prop('checked', true);
// make it readonly
$("#all-levels").attr('disabled', true);
// get other input values to levels array
for (var i=0; i < inp.length; i++) {
// skip default checkbox value
if (inp[i].value == 'all-levels') {
continue;
}
levels.push(inp[i].value);
}
console.log(levels);
}
// if user checked any other checkbox now
$('input.group').on('click', function () {
// remove check from default checkbox
$('#all-levels').prop('checked', false);
// make it enabled
$('#all-levels').removeAttr('disabled');
// get new values to levels array
levels = $('#course-levels input:checked').not($('#all-levels')).map(function () {
return this.value;
}).get();
console.log(levels);
}).eq(0).change();
// if all levels checkbox is clicked again
$('#all-levels').on('click', function(){
$('input.group').prop('checked', false);
// make default checkbox readonly so it will stay default
$('#all-levels').attr('disabled', true);
// make array empty
levels = [];
// get all input values to levels array
for (var i=0; i < inp.length; i++) {
// skip default checkbox value
if (inp[i].value == 'all-levels') {
continue;
}
levels.push(inp[i].value);
}
console.log(levels);
});
});
</script>
解决方案
您可以简单地通过检查所有.group
复选框长度是否与选中的复选框长度相同.group
并基于该 make#all-levels
再次选中来做到这一点,例如:
$('#all-levels').prop('checked', $('input.group').length === $('input.group:checked').length);
$(document).ready(function() {
// get reference to input elements
var inp = document.getElementsByTagName('input');
var levels = [];
// if checkboxes under 'group' class is not checked
if ($('input.group').prop('checked') == false) {
// make #all-levels default selected checkbox
$('#all-levels').prop('checked', true);
// make it readonly
$("#all-levels").attr('disabled', true);
// get other input values to levels array
for (var i = 0; i < inp.length; i++) {
// skip default checkbox value
if (inp[i].value == 'all-levels') {
continue;
}
levels.push(inp[i].value);
}
console.log(levels);
}
// if user checked any other checkbox now
$('input.group').on('click', function() {
// remove check from default checkbox
$('#all-levels').prop('checked', false);
// make it enabled
$('#all-levels').removeAttr('disabled');
// get new values to levels array
levels = $('#course-levels input:checked').not($('#all-levels')).map(function() {
return this.value;
}).get();
//console.log(levels);
$('#all-levels').prop('checked', $('input.group').length === $('input.group:checked').length);
}).eq(0).change();
// if all levels checkbox is clicked again
$('#all-levels').on('click', function() {
$('input.group').prop('checked', false);
// make default checkbox readonly so it will stay default
$('#all-levels').attr('disabled', true);
// make array empty
levels = [];
// get all input values to levels array
for (var i = 0; i < inp.length; i++) {
// skip default checkbox value
if (inp[i].value == 'all-levels') {
continue;
}
levels.push(inp[i].value);
}
console.log(levels);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="course-levels" class="list-group">
<input type="checkbox" value="all-levels" id="all-levels">
<input type="checkbox" value="degree" class="group">
<input type="checkbox" value="pgd" class="group">
<input type="checkbox" value="hnd" class="group">
</div>
推荐阅读
- autodesk-forge - Forge 中选择的透明亮点
- firebase - Does Firestore charge Cloud Function Get reads per retrieved documents?
- javascript - 初始化空的 JQuery 数据表并向其添加项目
- php - 如何调试和记录 PHP OPcache 问题
- angular - How to verify ngCopy method call in angular 6 unit test
- sorting - Yii2 过滤具有多重关系的数据
- sql - 错误:列“bob”不存在第 1 行:SELECT * FROM tag WHERE field1=Bob
- python-3.x - How to convert following date time format
- python - FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]` 而不是 `arr[seq]`
- c# - Windows 服务错误:进程意外终止