【问题标题】:Add class to a table row that contains columns with certain values将类添加到包含具有特定值的列的表行
【发布时间】:2012-05-16 15:32:38
【问题描述】:

当tr 包含包含某些值的td 时,我需要向它添加一个类。

使用this question on SO 的答案,我以为我找到了解决方案,但它似乎不适用于包含多列的行 - 只有在有一个 td 时才有效。

如何识别包含具有特定值的列以及其他列的表行?请注意,列并不总是按特定顺序排列,因此它必须是动态答案。

The jsFiddle

<table>
    <tr>
        <td>Hey!</td>
        <td>Other column</td>
        <td>Yo!</td>
        <td>Other column2</td>        
    </tr>
</table>

<script type="text/javascript">
$('tr').each(function(){
 if (($(this).find('td').text() == 'Hey!' ) && ($(this).find('td').text() == 'Yo!' ))
 {
     alert('here');
     $(this).addClass('disabled');
 }
});
</script>

【问题讨论】:

    标签: jquery jquery-selectors matching


    【解决方案1】:

    正如其他人提到的,使用 jQuery 的 :contains(text) 选择器:

    $('tr').each(function(){
       if($('td:contains("Hey!")', this).length && $('td:contains("Yo!")', this).length){       
            alert('here');
            $(this).addClass('disabled');
        }
    });
    

    类似的东西。

    编辑

    更新了我的答案以使用 length 而不是 jQuery 的 size() 函数。向那些张贴证据支持使用length 更快的人表示敬意。在做了我自己的一些基础研究之后,在 jQuery 文档中遇到了这个:

    .size() 方法在功能上等同于 .length 属性; 但是,首选 .length 属性,因为它没有 函数调用的开销。

    鉴于此,再加上下面的测试用例,我被卖了。想知道为什么size() 甚至存在吗?我的想法是,这是因为 jQuery 返回的某些对象不是数组,而只是 behave 类似数组,并且考虑到使用size() 更可取。看来,至少后者不是这样的。

    干杯

    【讨论】:

    • 正如其他人指出的那样,我更新了我的答案以利用 :contains(text)。但是,我相信我的答案是唯一会“禁用”该行的唯一一个,如果它包含 both 文本值。
    • 这行得通,但.size() 的目的是什么?还有@VisioN,你有证据/推理为什么length 总是更好吗?
    • 是的。函数调用比获取对象属性多 2 个操作。否则,这里有点像证明:stackoverflow.com/questions/2738352/…
    • @VisioN 感谢您跟进/通过您的观点,我已经更新了我的答案。
    • @Madbreaks 但是在这种情况下不是很关键,只是一个好习惯。
    【解决方案2】:

    怎么样:

    $('td:contains("Hey!"),td:contains("Yo!")').parent('tr').addClass('disabled');
    

    ?

    或者确保两者都存在

    $('tr').each(function(){
    
        if($('td:contains("Hey!")').length > 0 && $('td:contains("Yo!")').length > 0)
            $(this).addClass('disabled');
    
    });
    

    ​

    【讨论】:

    • 虽然我喜欢使用contains 的想法,但我认为这行不通。您的选择器将“禁用”一个tr,其中包含带有一个/两个文本值的单元格。看起来 op 想要禁用如果两个值都找到。
    • 是的,我重新阅读了这个问题并注意到可能是这种情况,只是在发布第二个代码示例之前在小提琴中测试了一些东西(只是想知道我是否可以再次在一个选择器中做到这一点,但我想不通)
    【解决方案3】:

    使用contains selector

    $("td:contains('Hey!'), td:contains('Yo!')").each(function(){
       alert('here');
       $(this).parent().addClass('disabled');
    });
    

    【讨论】:

    • 如果表格行的单元格中包含“嘿!”怎么办?但不是一个有“哟!”的单元格?它仍然会“禁用”该行,对吧?
    • 好点:)其他人已经更新了他们的答案来检查这种情况,所以我不会费心更新我的。
    【解决方案4】:

    这是一种解决方案:

    var search = ["Hey!", "Yo!"];
    
    $("tr").filter(function() {
        var found = 0;
        $(this).children().each(function() {
            var text = $(this).text();
            for (var i = 0; i < search.length; i++) {
                if (text == search[i]) found++;
            }
        });
        return found == search.length;
    }).addClass("disabled");​
    

    演示: http://jsfiddle.net/Tnq9A/1/


    如果不需要文字绝对吻合,只需要部分吻合,可以使用这种比较方法:

    if (text.indexOf(search[i]) != -1) found++;
    

    演示: http://jsfiddle.net/Tnq9A/2/

    【讨论】:

    • 您的过滤器函数如果找到任一值,将返回true,但只有找到both时才应返回true。
    • 对。可能我误解了这个问题。 现在它可以根据需要工作。
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-12-30
    • 2021-09-15
    相关资源
    最近更新 更多