jQuery操作复选框checkbox技巧总结

设置选中、取消选中、获取被选中的值、判断是否选中等

一、checked属性定义

先了解下input标签的checked属性:

1、HTML <input> checked 属性

定义和用法

  • checked 属性是一个布尔属性
  • checked 属性规定在页面加载时应该被预先选定的 <input> 元素
  • checked 属性适用于 <input type="checkbox"> 和 <input type="radio">
  • checked 属性也可以在页面加载后,通过 JavaScript 代码进行设置
注意:本文讨论的范围为jQuery1.6+ 以上版本,现在jQuery已经到3.2.1了。开发中建议使用1.11及以上版本。

二、checked属性的用法

重要提醒:操作checked、disabled、selected属性,强制建议只用prop()方法!不要用attr()方法。

1、jQuery判断checked是否是选中状态的三种方法

// 方法一:attr() - 返回 "checked" 或 "undefined"
$("#cb1").attr('checked');

// 方法二:prop() - 返回 true/false (推荐)
$("#cb1").prop('checked');

// 方法三:is() - 返回 true/false (推荐)
$("#cb1").is(':checked');  // 别忘记冒号哦

2、jQuery赋值checked的写法

不推荐写法(所有jQuery版本都可以,但已过时):

// 以下写法不推荐使用
$("#cb1").attr("checked", "checked");
$("#cb1").attr("checked", true);
$("#cb1").attr("checked", "true");

推荐写法 - prop()方法:

// 标准写法,推荐!
$("#cb1").prop("checked", true);

// map键值对
$("#cb1").prop({checked: true});

// 函数返回值
$("#cb1").prop("checked", function() {
    return true;  // 函数返回true或false
});

三、标签中checked="checked"已有,但却不显示打勾的解决办法

在做web项目的时候,做了一个功能,就是当勾选栏目,把所有的角色全勾上。

错误做法(使用attr导致的问题):

// 第一遍勾选和取消有效,但第二遍以后就没反应了
function check(id, check) {        
    if (check) {                
        $("." + id).find("input[type='checkbox']").attr("checked", true);        
    } else {                
        $("." + id).find("input[type='checkbox']").attr("checked", false);        
    }
}

正确做法(使用prop):

// 使用prop()方法解决
function check(id, check) {        
    if (check) {                
        $("." + id).find("input[type='checkbox']").prop("checked", true);        
    } else {                
        $("." + id).find("input[type='checkbox']").prop("checked", false);        
    }
}
这个问题出现的本质就是 jQuery 中的 attr()prop() 两个方法的使用区别。

四、jQuery操作checkbox技巧总结

1、获取单个checkbox选中项的值

// 三种写法
$("#chx1").find("input:checkbox:checked").val()
$("#chx1").find("input[type='checkbox']:checked").val();
$("#chx1").find("input[name='ck']:checked").val();

2、获取多个checkbox选中项

// 方法一:遍历所有复选框
$("#chk1").find('input:checkbox').each(function() {
    if ($(this).prop('checked') == true) {
        console.log($(this).val());  // 打印当前选中的值
    }
});

// 方法二:获取所有选中值放到数组
function getCheckBoxVal() { 
    var chk_value = []; 
    $("#chk1").find('input[name="test"]:checked').each(function() {
        chk_value.push($(this).val()); 
    }); 
    alert(chk_value.length == 0 ? '你还没有选择任何内容!' : chk_value); 
}

3、设置第一个checkbox为选中

$("#chk1").find('input:checkbox:first').prop("checked", true);
// 或者
$("#chk1").find('input:checkbox').eq(0).prop("checked", true);

4、设置最后一个checkbox为选中

$("#chk1").find('input:checkbox:last').prop("checked", true);

5、根据索引值设置任意checkbox为选中

// 根据索引设置
$("#chk1").find('input:checkbox').eq(索引值).prop('checked', true);

// 同时选中多个(切片方式)
$("#chk1").find('input:checkbox').slice(1, 2).prop('checked', true);

6、根据value值设置checkbox为选中

$("#chk1").find("input:checkbox[value='1']").prop('checked', true);
// 或者
$("#chk1").find("input[type='checkbox'][value='1']").prop('checked', true);

7、删除checkbox

// 删除value=1的checkbox
$("#chk1").find("input:checkbox[value='1']").remove();

// 删除第3个checkbox(索引从0开始)
$("#chk1").find("input:checkbox").eq(2).remove();

8、全部选中或全部取消选中

// 全部选中
$("#chk1").find('input:checkbox').each(function() {
    $(this).prop('checked', true);
});

// 全部取消选中
$("#chk1").find('input:checkbox').each(function () {
    $(this).prop('checked', false);
});

9、选中所有奇数项或偶数项

// 选中所有偶数
$("#chk1").find("input[type='checkbox']:even").prop("checked", true);

// 选中所有奇数
$("#chk1").find("input[type='checkbox']:odd").prop("checked", true);

10、反选(取反操作)

// 方法一:
$("#btn4").click(function() { 
    $("input[type='checkbox']").each(function() { 
        if ($(this).prop("checked")) { 
            $(this).prop("checked", false); 
        } else { 
            $(this).prop("checked", true); 
        } 
    });    
}); 

// 方法二:
$("#btn4").on('click', function() { 
    $("#chk1").find("input[type='checkbox']").prop("checked", function(index, oldValue) {
        return !oldValue;
    });
});

五、扩展:实际应用场景

全选/全不选功能实现

// HTML结构
// <input type="checkbox" id="checkAll"> 全选
// <input type="checkbox" name="item"> 选项1
// <input type="checkbox" name="item"> 选项2
// <input type="checkbox" name="item"> 选项3

// jQuery实现
$("#checkAll").click(function() {
    $("input[name='item']").prop("checked", $(this).prop("checked"));
});

// 子选项变化时更新全选状态
$("input[name='item']").click(function() {
    var allChecked = $("input[name='item']").length === $("input[name='item']:checked").length;
    $("#checkAll").prop("checked", allChecked);
});

表单提交前验证

function validateForm() {
    var checkedCount = $("input[name='agree']:checked").length;
    if (checkedCount === 0) {
        alert("请阅读并同意用户协议!");
        return false;
    }
    return true;
}

动态设置选中状态

// 根据后台返回值设置选中
$.ajax({
    url: "/api/getUserRoles",
    success: function(data) {
        $("input[name='role']").each(function() {
            if (data.roles.includes($(this).val())) {
                $(this).prop("checked", true);
            }
        });
    }
});
总结:jQuery操作checkbox的核心就是正确使用 prop() 方法来设置和获取checked状态,避免使用 attr() 方法导致的兼容性问题。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部