2015-10-05 10 views
5

ho avuto questa struttura della tabella:jquery elemento precedente, con diverse classi

<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> 

Quando un elemento tr ha alert classe, devo aggiungere alert classe all'elemento precedente con dossier di classe.

provo questo codice:

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

Questo è il lavoro solo con i <tr class="dossier"> elementi. Non funziona con gli elementi <tr class="even dossier">.

Qualcuno ha un modo per farlo?

+0

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

+0

ne dici di questo $ ("tr.alert"). prev ("tr.dossier, tr.even.dossier"). addClass ("alert"); –

+0

'$ (" tr.alert "). Prev (" tr.dossier, tr.even.dossier "). AddClass (" alert ");' ha lo stesso problema – user3469203

risposta

4

La spiegazione che segue è nel contesto del mio codice di esempio alla fine della mia risposta.

Prima di tutto dal momento che ha l' più tr.alert sarà necessario utilizzare .each() come si vogliono aggiungere la classe al più vicino tr.dossier ad ogni tr.alert ma lasciando al centro tr.dossier invariato.

L'utilizzo di $("tr.alert").prev("tr.dossier") restituisce solo l'elemento immediatamente precedente e solo se tale elemento è un tr con la classe dossier. Se si desidera un elemento che è più indietro attraverso il DOM, sarà necessario utilizzare $("tr.alert").prevAll("tr.dossier").

Tuttavia semplicemente utilizzando $("tr.alert").prevAll("tr.dossier") restituirà tutti i precedenti tr 's con la classe dossier per ogni tr.alert e poi combinarle in un'unica collezione. Nel caso del tuo DOM jQuery restituirà il primo tr.dossier per il tuo primo tr.alert e tutti e tre per l'ultimo. Questi quattro risultati saranno quindi ridotti ai tre oggetti effettivi disponibili nel DOM.

Da qui è possibile utilizzare .first() o .last() per selezionare un singolo elemento, ma sarà solo selezionare il tr.dossier che precede sia il vostro prima o l'ultima tr.alert e non verrà applicato a entrambi (come appare si richiede). L'utilizzo di .each() ti consentirà di gestire individualmente ogni tr.alert e di trovarlo più vicino a tr.dossier.

In questo esempio le righe con la classe dossier hanno uno sfondo verde e quelle con alert hanno la dimensione del carattere impostata su 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

Un buon approccio per includere nel selettore la classe. Non hai bisogno del extra 'if' che avevo nel mio codice. –

1

Usa 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

Penso che OP voglia aggiungere solo la classe 'alert' all'elemento 'dossier' che è prima. 'prevAll' ottiene ** tutti ** gli elementi' dossier'. – ieaglle

+0

Devo solo aggiungere la classe di avviso al primo elemento precedente con la classe del dossier. prevAll() aggiungerà l'elemento di avviso a tutti i precedenti elementi del fascicolo. Non è quello che voglio fare. – user3469203

+0

Ho provato la soluzione di Alex Char che funziona. Il tuo silenzio è lo stesso, quindi potrebbe funzionare anche – user3469203

6

È possibile scorrere tr elementi e verificare se hanno classe alert. Quindi è possibile controllare gli elementi precedenti che ha classe dossier e aggiungere classe alert a quell'elemento:

$("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

Funziona solo se l'avviso di dettaglio 'tr è subito dopo l'elemento' dossier'. – user3469203

+0

@ user3469203 Vuoi il primo elemento precedente con il 'dossier' di classe? –

+0

Sì, sta funzionando, molte grazie. – user3469203

Problemi correlati