前段时间,一个同事让我帮忙写个全选与反选的功能,本来一段很简单的代码,突然卡顿,写了好几个小时,其实之前也做过类似的功能,只是一下子就懵逼了,简而言之还是自己对checkbox的反选与全选没有掌握十足,所以再利用一些时间重复巩固了这个小功能,代码不长,想到了就简单,没想到就折腾好久。
就自己遇到一些坑,关于checkbox细谈一二,今天只用jquery实现
下面是html代码
<p><label><input type="checkbox" class="selectAll"/>全选</label></p>
<p><label><input type="checkbox" name="item"/>1</label></p>
<p><label><input type="checkbox" name="item"/>2</label></p>
<p><label><input type="checkbox" name="item"/>3</label></p>
<p><label><input type="checkbox" name="item"/>4</label></p>
<p>
<label><input type="checkbox" class="sel"/>全选</label>
<label><input type="checkbox" name="items"/>5</label>
<label><input type="checkbox" name="items"/>6</label>
<label><input type="checkbox" name="items"/>7</label>
<label><input type="checkbox" name="items"/>8</label>
</p>
<p>
<label><input type="checkbox" class="sel"/>全选</label>
<label><input type="checkbox" name="items"/>9</label>
<label><input type="checkbox" name="items"/>10</label>
<label><input type="checkbox" name="items"/>11</label>
<label><input type="checkbox" name="items"/>12</label>
<label><input type="checkbox" name="items"/>13</label>
</p>
<p>
<label><input type="checkbox" class="sel"/>全选</label>
<label><input type="checkbox" name="items"/>a</label>
<label><input type="checkbox" name="items"/>b</label>
<label><input type="checkbox" name="items"/>c</label>
<label><input type="checkbox" name="items"/>d</label>
</p>
<p>
<label><input type="checkbox" class="sel"/>全选</label>
<label><input type="checkbox" name="items"/>ded</label>
<label><input type="checkbox" name="items"/>ded</label>
<label><input type="checkbox" name="items"/>3ded</label>
</p>
以下是js代码
<script type='text/javascript'>
(function(){
$(".selectAll").click(function(){
$("input[name=item]").prop("checked",this.checked)
});
$("input[name=item]").on("click",function(){
var k = 0;
$("input[name=item]").each(function(i,item){
if(item.checked){
k++;
}
if(k == $("input[name=item]").length){
$(".selectAll").prop("checked",true)
}else{
$(".selectAll").prop("checked",false)
}
})
});
//针对另外一种场景
$(".sel").click(function(){
$(this).parent().nextAll().find("input[name=items]").prop("checked",this.checked);
});
$("input[name=items]").click(function(){
var items = $(this).parent().parent().find("input[name=items]");
var j = 0;//定义一个变量
for(var i=0;i<items.length;i++){
if(items[i].checked){
j++;
}
};
//用j的值与items的长度做比较,如果j的值等于items的长度,则说明全选
if(j==items.length){
$(this).parent().parent().find(".sel").prop("checked",true)
}else{
$(this).parent().parent().find(".sel").prop("checked",false)
}
})
})()
</script>
具体实现效果如下图:
在全选中是有坑的,当你使用在使用jqery中的attr方法时,你的全选和反选只能生效一次,再次重复点击时,就会无效。
1 $(".selectAll").click(function(){View Code
2 $("input[name=item]").attr("checked",this.checked)
3 });
此时你看到的效果就是这样的:
其实用attr()方法给checkbox作为全选与反选是存在问题的,当重复点击全选按钮,所有的的item中的checked只能动态改变一次,而不是你点击全选按钮就能重复改变item的checked的值。
综上所述:关于checkbox在全选与反选时,还是尽量使用jquery中提供的prop()方法,这样避免了和我当初一样,懵逼半天。
关于点击子chekbox选项,当所有checkbox都选上时,全选按钮才选上,只要有一个item的checkbox没选上,全选按钮就不选上,这里巧妙的利用一个变量值与所有items的长度做比较,如果条件里面仅用一个布尔值做判断,则会存在覆盖问题,这里的坑可以自己尝试一下,功能做完了,理解起来不是那么困难,以上代码根据自己适合的场景做修改即可。
<script type='text/javascript'> (function(){ $(".selectAll").click(function(){ $("input[name=item]").prop("checked",this.checked) });$("input[name=item]").on("click",function(){var k = 0;$("input[name=item]").each(function(i,item){if(item.checked){k++;}if(k == $("input[name=item]").length){$(".selectAll").prop("checked",true)}else{$(".selectAll").prop("checked",false)}})});//针对另外一种场景$(".sel").click(function(){$(this).parent().nextAll().find("input[name=items]").prop("checked",this.checked);});$("input[name=items]").click(function(){var items = $(this).parent().parent().find("input[name=items]");var j = 0;//定义一个变量for(var i=0;i<items.length;i++){if(items[i].checked){j++;}};//用j的值与items的长度做比较,如果j的值等于items的长度,则说明全选if(j==items.length){$(this).parent().parent().find(".sel").prop("checked",true)}else{$(this).parent().parent().find(".sel").prop("checked",false)}})
})()
</script>