网站首页 > 基础教程 正文
多选框全选与全不选的实现
多选框全选与全不选是前端开发人员必学的案例了,这里完成了以下需求:
- 当用户勾上“全选”时,自动选中所有语言,并把“全选”变成“全不选”;
- 当用户去掉“全不选”时,自动不选中所有语言;
- 当用户点击“反选”时,自动把所有语言状态反转(选中的变为未选,未选的变为选中);
- 当用户把所有语言都手动勾上时,“全选”被自动勾上,并变为“全不选”;
- 当用户手动去掉选中至少一种语言时,“全不选”自动被去掉选中,并变为“全选”。
网页代码部分如下:
<form id="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)
})
如有疑问,欢迎在评论区留言。
- 上一篇: jQuery里面的attr()和prop()的区别
- 下一篇: 系列专栏(六):解构赋值
猜你喜欢
- 2024-11-25 React 与 虚拟DOM
- 2024-11-25 Vue 的这5个技巧,可以大大提高我们的构建体验
- 2024-11-25 全新web前端开发教程之Jquery事件
- 2024-11-25 JQuery 实现简易记事簿
- 2024-11-25 一波Ts 基础大全;领先同事的机会来了
- 2024-11-25 Python教程:报表和日志精讲
- 2024-11-25 「jQuery-3」 获取和设置标签元素
- 2024-11-25 jq中attr 设置checkbox 选中状态中的坑
- 2024-11-25 「B/S端开发」DevExtreme初级入门教程 - 支持TypeScript
- 2024-11-25 jquery常用基础方法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)