2010-08-27 59 views
4

我有一个场景,我希望从表中选择行,具体取决于td中的值,例如tdJQuery:如何从表中选择行

我有这样

<tr> 
    <td>John</td> 
    <td>Smith</td> 
    <td>Male</td> 
</tr> 
<tr> 
    <td>Andy</td> 
    <td>Gates</td> 
    <td>Male</td> 
</tr> 
<tr> 
    <td>Alice</td> 
    <td>Nixon</td> 
    <td>Female</td> 
</tr> 

表,现在我想选择所有的行,如果第一个TD的值为x 和第二TD的值为y

在我做的东西momemnt像这样

$("tr").each(function (index) { 
    if ($(this).find('td:eq(0)').text().trim() == x && 
     $(this).find('td:eq(1)').text().trim() == y) 
      ...do somethin.... 
}); 

循环遍历每一行并检查。这是冗长的。有没有更好的方法来实现这一目标?我似乎无法找出运算符逻辑与选择器?

等待,

+0

题外话:提醒一下'.trim()'会在某些浏览器中失败。 – user113716 2010-08-27 20:40:05

+0

什么是替代呢? – nabeelfarid 2010-08-31 08:30:44

回答

6
$("tr").each(function (index) { 
    if ($.trim($(this).find('td:eq(0)').text()) == x && 
     $.trim($(this).find('td:eq(1)').text()) == y) { 
     $(this).closest('table').css('border', '1px solid red');​ // this should do it 
    } 
}); 

另外,使用.filter

$("tr").filter(function() { 
    return $.trim($(this).find('td:eq(0)').text()) == 'John' && 
      $.trim($(this).find('td:eq(1)').text()) == 'Smith'; 
}).closest('table').find('tr').css('border', '1px solid red');​ 

演示:http://jsfiddle.net/WhFbE/5/

+1

过滤方式看起来不错:)所以是jsfiddle – nabeelfarid 2010-08-27 16:48:47

3

下面是应该工作选择:

试试看:http://jsfiddle.net/N6TdM/

var x = "Andy"; 
var y = "Gates"; 

var res = $("td:first-child:contains(" + x + ") + td:contains(" + y + ")"); 

请注意,如果您有类似下面这样可以失败:

FIRST: Roberto  Rob 
SECOND: Robertson  Roberts 

搜索“罗布·罗伯茨”会给两场比赛。

1

您可以使用native DOM cells property上HTMLTableRowElement直接访问细胞,而不是列出所有后代细胞和挑选出一个与非标准:eq选择在环岛之旅发送的jQuery。

$('tr').each(function (index) { 
    if (
     $(this.cells[0]).text().trim()===x && 
     $(this.cells[1]).text().trim()===y 
    ) { 
     ... 
    } 
}); 

虽然它可能不会造成严重的性能差异。另一种方法是简单地维护包含预先修剪数据的数组,以节省甚至查看DOM。