2015-10-05 3 views
5

ich diese Struktur der Tabelle bekam:jquery vorherige Element mit mehreren Klassen

<tr class="dossier"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="detail"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="detail alert"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="dossier"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="detail"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="detail"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="even dossier"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="detail"> 
    <td>...</td> 
    <td>...</td> 
</tr> 
<tr class="detail alert"> 
    <td>...</td> 
    <td>...</td> 
</tr> 

Wenn ein tr Element alert Klasse hat, habe ich mit dossier Klasse alert Klasse zum vorherigen Elemente hinzuzufügen.

Ich versuche, diesen Code:

$("tr.alert").prev("tr.dossier").addClass("alert"); 

Dies funktioniert nur mit <tr class="dossier"> Elementen. Es funktioniert nicht mit <tr class="even dossier"> Elementen.

Hat jemand eine Möglichkeit, dies zu tun?

+0

'$ ("tr.alert") prevUntil ('tr.alert', "tr.dossier") addClass ("Alarm");..' –

+0

Wie über diese $ ("tr.alert"). prev ("tr.dossier, tr.even.dossier"). addClass ("alert"); –

+0

'$ (" tr.alert "). Prev (" tr.dossier, tr.even.dossier "). AddClass (" alert ");' hat das gleiche Problem – user3469203

Antwort

4

Die untene Erklärung im Zusammenhang mit meinem Beispiel-Code ist am Ende meiner Antwort.

Vor allem, da Sie haben mehrere tr.alert ‚s Sie .each() verwenden müssen, wie Sie wollen, Ihre Klasse auf den nächsten tr.dossier zu jedem tr.alert hinzufügen, aber die Mitte tr.dossier unverändert bleibt.

Mit $("tr.alert").prev("tr.dossier") wird nur das unmittelbar vorhergehende Element zurückgegeben und nur dann, wenn dieses Element eine tr mit der Klasse dossier ist. Wenn Sie ein Element benötigen, das weiter hinten im DOM liegt, müssen Sie $("tr.alert").prevAll("tr.dossier") verwenden.

jedoch einfach $("tr.alert").prevAll("tr.dossier") verwendet, wird alle bisherigen tr ‚s mit der Klasse zurückgeben dossier für jeden tr.alert und sie dann in einer Sammlung kombinieren. Im Falle Ihres DOM gibt jQuery die erste tr.dossier für Ihre erste tr.alert und alle drei für die letzte zurück. Diese vier Ergebnisse werden dann auf die drei tatsächlichen Elemente im DOM reduziert.

Von dort können Sie .first() oder .last() verwenden, um ein einzelnes Element zu wählen, aber es wird die tr.dossier vorhergehenden entweder die erste oder letzte tr.alert und nicht an beide nur wählen angewendet werden (wie es Sie benötigen erscheint). Mit .each() können Sie mit jedem tr.alert einzeln umgehen und finden Sie es am nächsten tr.dossier.

In diesem Beispiel sind die Zeilen mit der Klasse dossier grün hinterlegt und die mit alert haben die Schriftgröße 50px.

$("tr.alert").each(function(index, me) { 
 
    $(me).prevAll("tr.dossier").first().addClass("alert"); 
 
});
tr.alert { 
 
    font-size: 50px; 
 
} 
 
tr.dossier { 
 
    background-color: green; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table> 
 
    <tr class="dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail alert"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="even dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail alert"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
</table>

+0

Netter Ansatz, um in Selektor die Klasse aufzunehmen. Sie brauchen nicht das zusätzliche 'if', das ich in meinem Code hatte. –

1

Verwenden prevAll()

$($("tr.alert").prevAll("tr.dossier")[0]).addClass("alert");
.alert{ 
 
font-weight: bold; 
 
color:green; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script> 
 
<table> 
 
    <tr class="dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail alert"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="even dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail alert"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
</table>

+0

Ich denke OP möchte nur die 'alert' Klasse hinzufügen zu dem einen Dossierelement, das vorher ist. 'prevAll' bekommt ** all **' dossier' Elemente. – ieaglle

+0

Ich muss nur die Alert-Klasse zum ersten vorherigen Element mit Dossier-Klasse hinzufügen. prevAll() fügt das Alert-Element zu allen vorherigen Dossier-Elementen hinzu. Es ist nicht das, was ich machen möchte. – user3469203

+0

Ich habe Alex Char Lösung versucht, die funktioniert. Deines ist ruhig das selbe, also könnte es auch funktionieren – user3469203

6

Sie können durch tr Elemente durchlaufen und überprüfen, ob Klasse alert. Dann können Sie die vorherigen Elemente überprüfen, die Klasse hat dossier und fügen Klasse alert auf dieses Element:

$("table tr").each(function() { 
 
    if ($(this).hasClass("alert")) { 
 
    $(this).prevAll("tr.dossier").first().addClass("alert"); 
 
    } 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table> 
 
    <tr class="dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail alert"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="even dossier"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
    <tr class="detail alert"> 
 
    <td>...</td> 
 
    <td>...</td> 
 
    </tr> 
 
</table>

+0

Das funktioniert nur, wenn das 'detail alert' tr gleich nach dem 'dossier'-Element ist. – user3469203

+0

@ user3469203 Sie wollen das erste vorherige Element mit der Klasse 'dossier'? –

+0

Ja, das funktioniert, vielen Dank. – user3469203