使用hasClass函数在jquery父选择器中混淆

时间:2011-02-21 17:28:00

标签: javascript jquery

var allChecked = $('.inboxCheckbox:checked');

if(allChecked.length > 0){
    var messageIds = new Array();
    var parentRow = null;
    allChecked.each(
        function(){
            parentRow = $(this).parents('tr'); 
            if(!(parentRow.hasClass('gradeA'))){
                parentRow.addClass('gradeA');
                increaseUnreadMessage();
            }
            parentRow = null;
            messageIds.push($(this).val());
        }
    );

}else{
    showInsMessage('<b class="redTxt">Please Select At Least One Message</b>');
}

我有多行,每行都有一次复选框...如果选中复选框,我试图将等级A添加到每一行....如果已经有类等级A,我不想调用addClass ...当我选择多行时,它只将类添加到一行。这是否意味着

假设我有三行,每行有复选框,我选择每个复选框,当我运行 $(':checked').each( $(this).parents('tr') )选择带有复选框的所有行或仅选择特定的父行....我的假设是它只给出了特定的父行.....如果它给出特定的行那么它应该工作..但是一旦我将一个类添加到父行并移动到另一行,那么parentRow.hasClass('gradeA')返回true ...如果它用复选框检查所有行,我现在很困惑那么有没有办法选择特定的父行......

感谢您阅读

4 个答案:

答案 0 :(得分:1)

很高兴看到标记,是否有更多的表嵌套?

然而,

parentRow = $(this).closest('tr'); 

应该是更好的选择。

答案 1 :(得分:0)

API说.parents()方法搜索元素的所有祖先。 .parent()只在DOM树上运行一个级别。 如果您的复选框是'tr'的直接子(不是深层后代),那么您可以尝试

parentRow = $(this).parent('tr');

答案 2 :(得分:0)

顺便说一下,我认为你可以做更多jQuerish风格:

var messageIds = [];

$('tr.youTrs').toggleClass('gradeA', function () {
    var checkbox = $(this).find('.inboxCheckbox');
    if (checkbox.is(':checked')){
        messageIds.push(checkbox.val());
        return true;
    }
    else{
        showInsMessage('<b class="redTxt">Please Select At Least One Message</b>');
        return false;
    }
});

答案 3 :(得分:0)

您的代码应该有效。我怀疑问题正在发生,因为你的函数increaseUnreadMessage()正在抛出一个错误,导致跳过each()循环的其余部分。


但是,要回答您的具体问题:是的,您可以选择包含已选中复选框的所有行(<td> s)。使用jquery的:has selector,如下所示:

var allCheckedRows = $('tr:has(.inboxCheckbox:checked)');

当然,您可以使用addClass()将您的类名应用于所有这些:

allCheckedRows.addClass('gradeA');

当然,你的each()循环中还有其他事情发生,所以你可能无法完全抛弃each()。正如我上面所说,你的代码可以运行......但是这样的东西可能更干净,更容易理解。

var messageIds = new Array();

var allCheckedRows = $('tr:has(.inboxCheckbox:checked)');
allCheckedRows.addClass('gradeA');
allCheckedRows.find('.inboxCheckbox').each( function() {
   var cb = $(this);
   increaseUnreadMessage();
   messageIds.push( cb.val() );
});

if( messageIds.length === 0 ) {
   showInsMessage('<b class="redTxt">Please Select At Least One Message</b>');
}