检查是否选中了一组复选框但未禁用

时间:2015-01-19 19:24:47

标签: jquery html checkbox

此代码:

if ($('[id*="cat' + cat_id + '_sk"]').is(':checked') && $('[id*="cat' + cat_id + '_sk"]').not(':disabled')) {
        $('[id*="cat' + cat_id + '_sk"]').prop('checked', false);
} else if ($('[id*="cat' + cat_id + '_sk"]').not(':checked') && $('[id*="cat' + cat_id + '_sk"]').not(':disabled')) {
        $('[id*="cat' + cat_id + '_sk"]').prop('checked', 'checked');
}   

似乎忽略了if子句的第二部分;如果选中了复选框,我希望忽略它。

我已尝试使用前一个is(':disabled)执行!,也尝试使用boolean !(element).prop('disabled'); - 所有效果都相同。

上面的代码肯定被调用,因为所有复选框都会切换检查状态 - 问题围绕无法忽略禁用的复选框。

我的逻辑错了吗?

4 个答案:

答案 0 :(得分:2)

这应该会更好一点:

$('[id*="cat' + cat_id + '_sk"]').each(function(elm) {

    var $elm = $(elm);

    if($elm.is(':checked') && !$elm.is(':disabled')) {
         $elm.removeProp('checked');
    }
    else if(!$elm.is(':checked') && !$elm.is(':disabled')) {
         $elm.prop('checked', 'checked');
    }

});

正如A. Wolff上面所说,.is(':checked')将返回true,即使只检查了匹配集中的一个复选框。您需要使用each循环遍历元素。

答案 1 :(得分:1)

jQuery中的.not()只是一个减少当前元素集的过滤器。如果禁用它,它不会返回布尔值。

答案 2 :(得分:0)

您应该使用!obj.is(':checked')),例如:

if ($('[id*="cat' + cat_id + '_sk"]').is(':checked') && $('[id*="cat' + cat_id + '_sk"]').not(':disabled')) {
     $('[id*="cat' + cat_id + '_sk"]').prop('checked', false);
} else if (!$('[id*="cat' + cat_id + '_sk"]').is(':checked') && $('[id*="cat' + cat_id + '_sk"]').not(':disabled')) {
     $('[id*="cat' + cat_id + '_sk"]').prop('checked', 'checked');
}   

另一个例子,如果您想在选中后选中未选中的复选框,只需将逻辑分开,例如:

if ($('[id*="cat' + cat_id + '_sk"]').is(':checked')) {
    if ($('[id*="cat' + cat_id + '_sk"]').not(':disabled')) {
         $('[id*="cat' + cat_id + '_sk"]').prop('checked', false);
    } 
} else {
    if ($('[id*="cat' + cat_id + '_sk"]').not(':disabled')) {
         $('[id*="cat' + cat_id + '_sk"]').prop('checked', 'checked');
    }   
}

答案 3 :(得分:0)

这样的事情? http://jsfiddle.net/swm53ran/133/

if($(this).is(':checked') && $(this).attr('disabled') != 'disabled')

上面的代码行是指如果选中此复选框但未禁用

的逻辑
$(document).ready(function() {
    $('.check').each(function() {
        console.log($(this).attr('disabled'));
        if($(this).is(':checked') && $(this).attr('disabled') != 'disabled') {
            $(this).after('Checked and not disabled');
        }
    });
});

<input type="checkbox" class="check" checked disabled/><br/>
<input type="checkbox" class="check" /><br/>
<input type="checkbox" class="check" checked disabled/><br/>
<input type="checkbox" class="check" checked /><br/>
<input type="checkbox" class="check" /><br/>
<input type="checkbox" class="check" disabled /><br/>
<input type="checkbox" class="check" /><br/>

希望这会有所帮助