一开始的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>复选框</title> <script src="https://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script> <script type="text/javascript"> $(function() { $("#all").click(function () { if (this.checked) { $("#list :checkbox").each(function () { $(this).attr("checked", true); //选择器要有空格隔开 }) } else { $("#list :checkbox").each(function () { $(this).attr("checked", false); }) } }); }) </script> </head> <body> <ul> <li><label><input type="checkbox" value="1">广东省 </label></li> <li><label><input type="checkbox" value="2">广西省 </label></li> <li><label><input type="checkbox" value="3">河南省 </label></li> <li><label><input type="checkbox" value="4">福建省 </label></li> <li><label><input type="checkbox" value="5">湖南省 </label></li> <li><label><input type="checkbox" value="6">江西省 </label></li> </ul> <input type="checkbox"> <input type="button" value="全选"> <input type="button" value="全不选"> <input type="button" value="反选"> <input type="button" value="获得选中的所有值"> </body> </html>
当使用带有jQuery的方法attr()时,会有相应的问题存在,比如当你在点击id=all的复选框前去点击id=list下的复选框,这时当你再次点击id=all的复选框时就会出现之前点击的复选框没有变化,但是查看元素时发现该复选框的checked值会发生相应的变化。我查了一下资料,问题出在如下:
原来是jQuery版本问题。因为这里用的是attr(),而jQuery的版本用的是3.1.0的,这就存在一个兼容性问题。
$("XXX").attr("attrName");而jQuery的版本用的是2.1.1,这就是存在一个兼容性和稳定性问题。
jQuery API明确说明,1.6+的jQuery要用prop,尤其是checkBox的checked的属性的判断,
即使用代码如下:
$(function() { $("#all").click(function () { if (this.checked) { $("#list :checkbox").each(function () { $(this).prop("checked", true); //选择器要有空格隔开 }) } else { $("#list :checkbox").each(function () { $(this).prop("checked", false); }) } });
给出使用jQuery事先的全选和全不选:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>复选框</title> <script src="https://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script> <script type="text/javascript"> $(function() { $("#all").click(function () { if (this.checked) { $("#list :checkbox").each(function () { $(this).prop("checked", true); //选择器要有空格隔开 }) } else { $("#list :checkbox").each(function () { $(this).prop("checked", false); }) } }); //第二种 // $("#all").click(function(){ // if(this.checked){ // $("#list :checkbox").prop("checked", true); // }else{ // $("#list :checkbox").prop("checked", false); // } // }); //全选 $("#selectAll").click(function () { $("#list :checkbox,#all").prop("checked", true); }); //全不选 $("#unSelect").click(function () { $("#list :checkbox,#all").prop("checked", false); }); //反选 $("#reverse").click(function () { $("#list :checkbox").each(function () { // $(this).prop("checked", !$(this).prop("checked")); this.checked=!this.checked; }); if($('#list :checkbox:checked').length==$("#list :checkbox").length){ $("#all").prop("checked",true); } else{ $("#all").prop("checked",false); } }); //获取选中的值 $("#getValue").click(function(){ var valArr = new Array(); $("#list :checkbox:checked").each(function(i){ //判断被选中的 valArr[i] = $(this).val(); }) var vals = valArr.join(',');//转换为逗号隔开的字符串 alert(vals); }); }) </script> </head> <body> <ul> <li><label><input type="checkbox" value="1.广东省">广东省 </label></li> <li><label><input type="checkbox" value="2.广西省">广西省 </label></li> <li><label><input type="checkbox" value="3.河南省">河南省 </label></li> <li><label><input type="checkbox" value="4.福建省">福建省 </label></li> <li><label><input type="checkbox" value="5.湖南省">湖南省 </label></li> <li><label><input type="checkbox" value="6.江西省">江西省 </label></li> </ul> <input type="checkbox"> <input type="button" value="全选"> <input type="button" value="全不选"> <input type="button" value="反选"> <input type="button" value="获得选中的所有值"> </body> </html>
使用原声JS实现全选和全不选