我正在尝试编写一个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/
答案 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');
由于您希望选择合并: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');