<form id=34;test-form" action="test"> <legend>请选择想要学习的编程措辞:</legend> <fieldset> <p> <label class="selectAll"> <input type="checkbox"> <span class="selectAll">全选</span> <span class="deselectAll">全不选</span> </label> <a href="#0" class="invertSelect">反选</a></p> <p><label><input type="checkbox" name="lang" value="javascript"> JavaScript</label></p> <p><label><input type="checkbox" name="lang" value="python"> Python</label></p> <p><label><input type="checkbox" name="lang" value="ruby"> Ruby</label></p> <p><label><input type="checkbox" name="lang" value="haskell"> Haskell</label></p> <p><label><input type="checkbox" name="lang" value="scheme"> Scheme</label></p> <p> <button type="submit">Submit</button> </p> </fieldset></form>
先获取dom元素
var form = $('#test-form'), langs = form.find('[name=lang]'), selectAll = form.find('label.selectAll :checkbox'), selectAllLabel = form.find('label.selectAll span.selectAll'), deselectAllLabel = form.find('label.selectAll span.deselectAll'), invertSelect = form.find('a.invertSelect');
全选与全不选实现起来很大略,利用jquery工具的prop方法来设置选中状态,须要把稳的是这里不能利用attr()方法:
// 全选与全不选 selectAll.on("change",()=>{ if(selectAll.prop("checked")) { //全选 langs.prop("checked",true) selectAllLabel.hide() deselectAllLabel.show() }else{ // 全不选 langs.prop("checked",false) selectAllLabel.show() deselectAllLabel.hide() } })
反选的方法也很大略:
invertSelect.on("click",()=>{ //jquery工具要先利用Array.from方法转换成数组,利用数组来遍历 //须要把稳的是,遍历的每一个元素是dom工具,而不是jquery工具了, //不能再利用prop方法了 Array.from(langs).forEach(item=>item.checked=!item.checked) })
当用户把所有措辞都手动勾上时,“全选”被自动勾上,并变为“全不选”。实现这个需求,须要让change事宜绑定所有的name为lang的checkbox工具(langs),事宜触发时,要遍历所有的langs,如果全部为选中状态,则“全选”自动勾上,并变为“全不选”。这里获取所有的选中状态的checkbox,可以利用 $('[name=lang]:checked'),代码如下:
var langsChecked = $('[name=lang]:checked') //如果选中的checkbox数量大于即是5,即是全部选中 if(langsChecked.length>=5){ //全选打勾 selectAll.prop("checked",true) //全选标签隐蔽 selectAllLabel.hide() //全不选标签显示 deselectAllLabel.show() }else{ //全选去掉勾 selectAll.prop("checked",false) //全选标签显示 selectAllLabel.show() //全不选标签隐蔽 deselectAllLabel.hide() }
为避免与之前的代码显示冲突,这里封装为一个方法,前面的代码也须要利用该方法,完全代码如下:
$(function(){ var form = $('#test-form'), langs = form.find('[name=lang]'), selectAll = form.find('label.selectAll :checkbox'), selectAllLabel = form.find('label.selectAll span.selectAll'), deselectAllLabel = form.find('label.selectAll span.deselectAll'), invertSelect = form.find('a.invertSelect'); // 全选与全不选 selectAll.on("change",()=>{ if(selectAll.prop("checked")) { //全选 langs.prop("checked",true) selectAllLabel.hide() deselectAllLabel.show() }else{ // 全不选 langs.prop("checked",false) selectAllLabel.show() deselectAllLabel.hide() } select() }) //反选 invertSelect.on("click",()=>{ //jquery工具要先利用Array.from方法转换成数组,利用数组来遍历 //须要把稳的是,遍历的每一个元素是dom工具,而不是jquery工具了, //不能再利用prop方法了 Array.from(langs).forEach(item=>item.checked=!item.checked) select() }) //当用户把所有措辞都手动勾上时,“全选”被自动勾上,并变为“全不选”; //当用户手动去掉选中至少一种措辞时,“全不选”自动被去掉选中,并变为“全选”。 function select(){ var langsChecked = $('[name=lang]:checked') console.log(langsChecked) //如果选中的checkbox数量大于即是5,即是全部选中 if(langsChecked.length>=5){ selectAll.prop("checked",true) selectAllLabel.hide() deselectAllLabel.show() }else{ selectAll.prop("checked",false) selectAllLabel.show() deselectAllLabel.hide() } } langs.change(select)})
如有疑问,欢迎在评论区留言。