js判断单选框checkbox是否选中(详解checkbox选中和不选中)

多选框全选与全不选的实现

多选框全选与全不选是前端开发人员必学的案例了,这里完成了以下需求:

  • 当用户勾上“全选”时,自动选中所有语言,并把“全选”变成“全不选”;
  • 当用户去掉“全不选”时,自动不选中所有语言;
  • 当用户点击“反选”时,自动把所有语言状态反转(选中的变为未选,未选的变为选中);
  • 当用户把所有语言都手动勾上时,“全选”被自动勾上,并变为“全不选”;
  • 当用户手动去掉选中至少一种语言时,“全不选”自动被去掉选中,并变为“全选”。

网页代码部分如下:

<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)

})
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至624739273@qq.com举报,一经查实,本站将立刻删除。
Like (0)
柳的头像

相关推荐

发表回复

Please Login to Comment
微信
微信
SHARE
TOP
要想花得少,就用购宝。话费电费9折起,官方公众号:购宝