为什么attr()在第二次调用时不会更新HTML?

时间:2013-02-21 15:24:42

标签: jquery dom-traversal

当选择祖先复选框时,我有一个应该选择所有后代输入复选框的脚本。

见这里:http://jsfiddle.net/zJPfR/

选中顶级复选框后,将选中下方的所有复选框。如果取消选中该复选框,则会删除检查。但是,如果您再次尝试执行此操作,则无效。

如果我这样做不正确,请告诉我。

Darius

        $('.poSelect').click(function() {
        var expandBox   = $(this).parents('.pohelpTbl').next('.expandBox');
        var receipts    = expandBox.find('input[type="checkbox"]');

        if ($(this).is(':checked')) {
            var status = true;
        } else {
            var status = false;
        }

        $(receipts).each(function (i) {
            var cb = $(this);
            cb.attr("checked",status);          
        });
    });

3 个答案:

答案 0 :(得分:4)

jQuery的.attr仅使用初始属性。使用.prop代替.attr来更改当前的DOM。
cb.attr("checked",status); => cb.prop("checked",status);

答案 1 :(得分:1)

应该是

$('.poSelect').click(function() {
    var receipts    = $(this).closest('.pohelpTbl').next('.expandBox').find(':checkbox');

    receipts.prop('checked', this.checked);
});

无需遍历每个receipts项,您可以直接在.prop()上致电receipts

演示:Fiddle

答案 2 :(得分:0)

checked属性的存在是显示要检查的复选框的内容,而不是属性的值被设置为true或false。

从此改变:

var cb = $(this);
cb.attr("checked",status);

到此:

var cb = $(this);
if (status){
    cb.attr("checked","checked");
}
else{
    cb.removeAttr("checked");
}