使用 jQuery 只选择第一级后代 - 有没有更好的方法

Select only first level of descendants with jQuery - is there a better way?

本文关键字:后代 一级 有没有 更好 方法 jQuery 选择 使用      更新时间:2023-09-26

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

作为其中的一部分,我正在尝试选择插件选项中指定的特定表的前 n 行或列。问题是某些行包含其他嵌套表。不幸的是,我对此无能为力。所以我的问题是,如何在表中仅获得第一级<tr>?使用 .children('tr') 并不总是有效,因为行不一定是表的直接子级——可能存在<thead>或(理想情况下)用户可能能够在包含元素上调用插件,并且它应该足够智能以找到其中的表
编辑:实际上,现在我认为如果我们必须按 id 选择表,第二位将不起作用。但我认为要求人们只在桌子上使用插件并不过分,因为这就是它的用途......

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

到目前为止,基于这个答案的后半部分,我想出的是这样的:

$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:显然选择器版本实际上比 .not() 快。给我的消息。

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

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

有关其他选项,请参阅"jQuery 选择器"。

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

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

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

给你的表一个"ID",这样你就有一个起点,并使用直接子选择器

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

因为 tr 可以位于该特定表的表、正文或标题下