jQuery“select all except”

时间:2009-12-13 13:16:57

标签: jquery jquery-selectors

我正在尝试选择表格的第一行。注意:第一行包含在thead标记中,因此:

<table>
  <thead>
    <tr>  <!-- first row --> </tr>
  </thead>
  <tbody>
    <tr>  <!-- body --> </tr>
  </tbody>
  <tfoot>
    <tr>  <!-- body --> </tr>
  </tfoot>
</table> 

如果不是包装器标签,则'select first row'提示可以正常工作。这是我尝试但不起作用的:

 $("*:not(thead)", tableSelector).remove();

即,我想使用“非tfoot”选择器摆脱tbody和tfoot选择器。因为除了<thead>和内部的所有内容之外,我想从表中删除其他所有内容。所以基本上我要做的就是选择除了thead之外的所有东西以及它里面的东西;像:not(thead *)这样的东西可以起作用,但不起作用。

我的解决方法是$("tbody, tfoot", tableSelector).remove();,但我想学习并了解如何使用相反的(非选择器)。

6 个答案:

答案 0 :(得分:20)

你的问题并不完全清楚。要选择单个表中的第一行:

$("table tr:first")...

或反过来:

$("table tr:not(:first)")...

将会这样做,但是如果有多个表,它将会中断(即使有三个表,它也只会选择一行)。你可以用以下方法解决这个问题:

$("table").each(function() {
  $(this).find("tr:first")...
});

您可以使用以下内容获取不在THEAD中的所有行:

$("table > :not(thead) > tr")...

编辑:我认为你过于复杂了。如果你想删除除THEAD及其内容之外的所有内容,那就相当简单了:

$("table > :not(thead)").remove();

如果要将TBODY和TFOOT元素保留在原位,请将其更改为:

$("table > :not(thead) > tr").remove();

答案 1 :(得分:1)

在表格选择器上使用children()将仅选择直接子节点。您可以使用非选择器过滤此内容。

$(tableSelector).children(':not(thead)').remove();

答案 2 :(得分:1)

  

我正在尝试选择表格的第一行。

为什么不使用好的旧DOM?

mytable.rows[0]

答案 3 :(得分:0)

如果您要移除除table之外的任何child of thead,请尝试使用此选择器:

table > *:not(thead)

编辑由于您指出您已在变量中使用该表:

$("> *:not(thead)", context)

答案 4 :(得分:0)

“:not”伪选择器接收另一个选择器作为参数,因此您实际上可以删除除此之外的所有内容,如下所示:

$(':not(thead, thead *)', 'table').remove();

你可以see it in action here

这与您在your comment中编写的内容非常相似,除了您没有使用上下文(删除了表节点)并且您使用了不包含“内容”中的“所有内容”的子操作数,但只包括它的直接孩子。删除子操作数“&gt;”排除所有节点的后代,而不仅仅是直接子节点。

答案 5 :(得分:-1)

我会像:

$('table thead  tr:first-child')