使用jQuery仅选择第一级后代 - 有更好的方法吗?

时间:2012-08-09 15:11:26

标签: javascript jquery

我正在尝试构建一个jQuery插件来锁定表格中的行或列,以及Excel的冻结窗格。 (还有很多其他很好的解决方案,但是由于各种原因,它们都没有为我工作。我认为这可能与表格在模态弹出窗口中有关。但我离题了。)

作为其中的一部分,我试图选择插件选项中指定的特定表的第一个 n 行或列。问题是某些行包含其他嵌套表。遗憾的是我无能为力。所以我的问题是,如何在表格中仅获得<tr>的第一级?使用.children('tr')并不总是有效,因为该行不一定是表的直接子项 - 可能有<thead> 或(理想情况下)用户可以调用包含元素的插件,它应该足够聪明,可以在其中找到表格 编辑:实际上,如果我们必须按ID选择表格,我现在认为第二位不会起作用。但是我觉得要求人们只在桌面上使用插件并不是太多,因为那就是它的用途......

简而言之:我如何只选择第一级表行,这些表行可能是也可能不是特定包含元素的直接子项?

到目前为止,基于this answer的后半部分我想出的是:

$el.find('tr:not(tr tr):lt('+base.options.rows+')')

和列:

$el.find('tr:not(tr tr)').find('(td,th):lt('+base.options.columns+')')

但这看起来非常漫长而笨重,我想知道是否有更短/更清洁的方式。或者有没有办法只使用普通的旧JavaScript?

编辑2: Apparently the selector version is actually faster than .not()。给我的消息。

2 个答案:

答案 0 :(得分:2)

使用正确的选择器。在这种情况下,那将是>,直接子选择器:

$el.find('#table > tbody tr > td, #table > tbody tr > th');

有关其他选项,请参阅“jQuery Selectors”。

或者,只需迭代tbody的所有直接孩子:

var cells = $el.children('tbody').children('tr').children();

由于只允许tdtr作为tr的子项,因此该列表应该已经是您想要的列表。

答案 1 :(得分:1)

为您的表格提供“ID”,以便您有一个起点并使用直接子选择器

$('tableID, tableID > tbody,tableID > thead, tableID > tfoot').children('tr')

因为tr可以在特定表的表格,tbody或thead下面