2016-11-16 1 views
2

Ich habe eine Tabelle mit einer variablen Anzahl von <td> Elementen in jeder Zeile, aber mit maximal 3 <td> Elementen pro Zeile. Angenommen, ich möchte die Zeilen mit weniger als 3 <td> Elementen auswählen und sie einer Variablen zuweisen. Gibt es eine Möglichkeit, diese Zeilen nur mit jQuery auszuwählen? Ich weiß, dass ich etwas verwenden können, wo ich durch jede Zeile durchlaufen, etwa so:jQuery-Selektor, der alle übergeordneten Elemente mit weniger als n untergeordneten Elementen enthält

var rows = $("tr").filter(function() { 
 
    return $(this).children().length < 3 
 
}); 
 

 
rows.css("background-color", "blue");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
    </tr> 
 
    <tr> 
 
     <td>1</td> 
 
    </tr> 
 
    <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

Gibt es eine Weise, die ich das gleiche tun mit nur jQuery Selektoren und Methoden (zB .siblings() oder .parents()) ?

Here's ein JSFiddle des Beispiels, das ich gab. Ich habe nach einer ähnlichen Frage gesucht, konnte aber nichts dergleichen finden, also hoffe ich, dass jemand ein paar Ideen hat, wenn das möglich ist.

+0

Sie erkennen, dass ohne Colspan ist dies nicht gültig HTML? Jede Tabellenzeile muss die gleiche Anzahl von Spalten haben ... –

+0

@Iwrestledabearonce. Ja, das ist mir klar. Ich hätte diese Attribute wahrscheinlich zum HTML hinzufügen müssen, aber ich habe nur ein einfaches Beispiel bekommen, das ich zeigen könnte. –

Antwort

6

Verwenden Sie die Kombination :not(), :has() und :eq() Pseudoklassen-Selektoren.

var rows = $("tr:not(:has(:eq(2)))"); 
 

 
rows.css("background-color", "blue");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
    </tr> 
 
    <tr> 
 
     <td>1</td> 
 
    </tr> 
 
    <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
    </tr> 
 
    </tbody> 
 
</table>


FYI: nach Bedarf Je Sie :nth-child() oder :nth-of-type() statt :eq() Methode verwenden können.

+1

Upvoted, da es eine mögliche Lösung ist, aber persönlich würde ich 'filter()' verwenden - es ist viel leichter lesbar. Beachten Sie auch, dass dies nicht nur für Kinder gilt. Wenn Sie einen "" um einen Wert in der dritten Zeile setzen, fängt es nicht mehr. OP muss vorsichtig sein, wenn weitere Kindelemente vorhanden sind. –

+0

@RoryMcCrossan: Er ist bereits das Ergebnis mit 'filter' erreicht –

+0

@RoryMcCrossan: Das würde es ungültig machen Markup ..... selbst in diesem Fall mit' nth-of-type() 'stattdessen löst das Problem –

Verwandte Themen