使用jQuery选择器获取一系列表格单元格

时间:2016-01-13 03:06:33

标签: jquery jquery-selectors

我正在尝试编写一个jQuery选择器来选择一系列表格单元格(minRow,minCol)到(maxRow,maxCol)。

我有一个适用于水平范围(第1列,第2行)到(第3栏,第2行)的选择器 $('tr:lt(3):gt(1) td:lt(4):gt(0))')

但是对于相应的垂直范围(第2列,第1行)到(第2列,第3行),这都失败了 $('tr:lt(4):gt(0) td:lt(3):gt(1)')
因为td选择器不会在行上循环,所以它只需要第一个

此版本使用地图和每个作品
$('tr:lt(4):gt(0)').map( function() { return $(this).find('td:lt(3):gt(1)') } ).each( function() { /* this.do_something */ } );
但是更加丑陋

有没有一种优雅的方法来实现这一目标?

寻找比:lt():gt()

更优雅的范围选择器的奖励积分

上述水平和垂直范围以及块范围的示例都在这个小提琴http://jsfiddle.net/jghaines/qeLhgw4f/4/

1 个答案:

答案 0 :(得分:3)

选择器tr:lt(3):gt(1) td:lt(4):gt(0)仅适用,因为正在选择单行。发生了什么tr:lt(3):gt(1)会在第3行返回一组td个元素,而td:lt(4):gt(0)将会选择第二个,第三个和第四个td个元素。 该特定集中的索引。

使用tr:lt(4):gt(0) td:lt(3):gt(1)之类的选择器时,会选择多行,并且选择器相对于返回的集合(而不是每个单独的td元素)进行复合。选择器tr:lt(4):gt(0)返回由第二行,第三行和第四行组成的集合。根据此返回的集合,选择器td:lt(3):gt(1)将按特定集中的索引选择第三个td元素。

换句话说,:gt() / :lt()选择器将选择索引大于或小于匹配集中索引的所有元素。您的选择器没有按预期工作,因为元素是根据匹配的集合(而不是每个单独的td元素)选择的。

解决方案是在.find() / tr:lt(4):gt(0)之间链接td:lt(3):gt(1)方法。

换句话说,替换:

$('table#2 tr:lt(4):gt(0) td:lt(3):gt(1)').addClass('red');

使用:

$('table#2 tr:lt(4):gt(0)').find('td:lt(3):gt(1)').addClass('red');

Updated Example

由于您希望选择合并:lt():gt(),因此值得指出您可以使用.slice()方法:

例如,您可以替换:

$('table#2 tr:lt(4):gt(0) td:lt(3):gt(1)').addClass('red');

使用:

$('table#2 tr').slice(1, 4).find('td:lt(3):gt(1)').addClass('red');