第二个“全部检查”功能无法运行

时间:2013-03-19 20:42:29

标签: jquery checkbox

如果有一些未经检查的话,我有一个应该检查所有复选框的函数。如果它们都被选中,那么它将取消全部取消选中。

在您第三次点击check all链接之前,它会按预期工作。

  1. 首先点击全部检查
  2. 第二次点击取消全部取消选中
  3. 第三次点击应该再次检查它们,但不是
  4. function CheckAll(name) {
        name = name.replace(/[[]/g, '\\[').replace(/]/g, '\\]');
    
        if ($('input[name=' + name + ']:checkbox:not(:checked)').length) {
            $('input[name=' + name + ']:checkbox:not(:checked)').attr('checked', true);
        } else {
            $('input[name=' + name + ']:checkbox:checked').attr('checked', false);
        }
    }
    

    简单的HTML

        <a href="#" onclick="CheckAll('users[]')">Check All</a><br/><br/>
        <input type="checkbox" name="users[]" checked="checked"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
        <input type="checkbox" name="users[]"/><br/>
    

    jsFiddle link

2 个答案:

答案 0 :(得分:3)

如果您使用的是jquery 1.6 +

,则需要使用.prop()而不是.attr()

在该版本之后,处理的属性与属性不同,并且checked是属性而非属性。

正在发生的事情是.attr()只检查属性是否存在,它不关心值是什么。所以检查=&#34;假&#34;如果您使用.attr(),仍会返回true

如果使用.prop(),它将正确返回属性值,在我给出的示例中,该值将为false。

答案 1 :(得分:0)

您已经建议使用prop()代替.attr()。我认为你可以用更少的代码来实现你的结果:

function CheckAll(name) {
    name = name.replace(/[[]/g, '\\[').replace(/]/g, '\\]'),
    checkboxes = 'input[name=' + name + ']:checkbox';
    $(checkboxes).prop('checked', $(checkboxes + ':checked').length !== $(checkboxes).length);
}