2009-12-13 23 views
16

Ich versuche, die erste Zeile einer Tabelle auszuwählen. Hinweis: die erste Zeile in einem thead Tag gewickelt ist, so:jQuery "Wählen Sie alle außer"

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

Die 'select first row' Spitze arbeiten könnte, wenn es nicht für die Wrapper-Tags ist. Dies ist, was ich versucht habe, funktioniert aber nicht:

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

Das heißt, würde ich tbody und tfoot Selektoren beide gereinigt weg bekommen mit einem Selektor „nicht TFOOT“. Weil ich alles andere außer dem <thead> und alles-inside-thead von der Tabelle entfernen möchte. Also versuche ich im Grunde alles zu wählen außer Thead und was drin ist; Intellektuell etwas wie :not(thead *) könnte funktionieren, aber nicht.

Meine Problemumgehung ist $("tbody, tfoot", tableSelector).remove();, aber ich möchte lernen und verstehen, wie das Gegenteil zu verwenden (nicht-Selektor).

+0

Es ist nicht klar, was Sie versuchen, hier zu tun. Kannst du umformulieren? – cletus

+0

'' tbody, tfoot'' scheint hier am besten. In der Tat würde ich vorschlagen, bis ich Ihre Frage vollständig gelesen habe. Auf den Punkt: ': not (thead)' ist fehlgeschlagen, weil auch das 'tr' ausgewählt und entfernt wurde. – Kobi

+0

Also gibt es keinen solchen Selektor wie "thead und seine Kinder", also könnte ich sagen: nicht (thead-and-its'children)? – Martin

Antwort

20

Ihre Frage ist nicht genau klar. Um die erste Zeile in einer Tabelle auswählen:

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

oder umgekehrt:

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

wird es tun, aber das wird brechen, wenn es mehr als eine Tabelle ist (es wird nur wählen, eine Zeile, selbst wenn es gibt drei Tabellen). Sie können das Problem umgehen, dass mit:

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

Sie können alle Zeilen bekommen nicht in THEAD mit:

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

Edit: Ich glaube, Sie über verkompliziert dies. Wenn Sie alles außer THEAD und seinen Inhalt entfernen wollen, ist das relativ einfach:

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

Wenn Sie die TBODY und TFOOT Elemente anstelle Änderung verlassen wollen es an:

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

Ok, um klar zu sein. Wählen Sie die erste Zeile zusammen mit seinem Thead. Weil ich alles andere aus der Tabelle mit Ausnahme der '' und alles in thead entfernen möchte. – Martin

+0

+1 für die "Ihre Frage ist nicht genau klar" ;-) – Frunsi

+0

+1 für die Abdeckung aller Möglichkeiten. :-) – Nagri

1

Mit children() auf die Tabellenauswahl wählt nur die direkten Kinder aus. Sie können dies mit Ihrem Nichtselektor filtern.

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

Dieser ist ungefähr 30 mal langsamer als eine Selektor-Lösung. – vrutberg

+0

Möchten Sie das erklären? Meine einfachen Tests zeigen mir, dass Ihre Lösung im Durchschnitt 400 ms für 1000 Iterationen benötigt und meine dauert etwas mehr als 300 ms für die gleichen 1000 Iterationen. – tvanfosson

+0

... beachte, dass ich in meinem Test eher ausblenden/zeigen als entfernen wollte. – tvanfosson

1

Ich versuche, die erste Zeile einer Tabelle auszuwählen.

Warum nicht gute alte DOM verwenden?

mytable.rows[0] 
+0

Ich will, dass THEAD mitkommen, also schneiden einfache Reihen es nicht. – Martin

+0

Außerdem möchte ich alles andere von der Tabelle entfernen, so dass nur die Auswahl von Zeilen mich nirgendwo hinbringt. – Martin

0

Wenn Sie child of ein table außer thead entfernen möchten, versuchen Sie diesen Selektor:

table > *:not(thead) 

bearbeiten Da Sie wies darauf hin, dass Sie bereits die Tabelle in einer Variablen haben:

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

Wieder möchte ich den Conext-Spezifizierer verwenden. $ (xx, Kontext) – Martin

+0

Nein .. das funktioniert auch nicht. Es entfernt alles.Nur "tbody, tfoot" scheint bis jetzt zu funktionieren. – Martin

+0

@Martin: Und der Kontext ist wirklich nur dein Tisch? Wie '$ (" Tabelle ")'? – Gumbo

0

Die „: nicht“ Pseudo-Selektor empfängt anderen Selektor als Parameter, so kann man eigentlich alles, außer dies und das wie folgt entfernen:

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

Sie können see it in action here.

Das ist sehr ähnlich zu dem, was Sie in your comment geschrieben haben, außer dass Sie keinen Kontext verwendet haben enthalten nur die direkten Kinder. Durch das Entfernen des Child-Operanden ">" werden alle Nachkommen des Knotens ausgeschlossen, nicht nur die direkten untergeordneten Elemente.

-1

Ich werde wie:

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