Come posso selezionare un elemento con più classi in jQuery?


2062

Voglio selezionare tutti gli elementi che hanno le due classi ae b.

<element class="a b">

Quindi, solo gli elementi che hanno entrambe le classi.

Quando lo uso $(".a, .b")mi dà l'unione, ma voglio l'intersezione.


2
Sarebbe bello se potessi definire cosa significhino unione e intersezione per noi principianti :)
Kolob Canyon

10
L'unione e l'intersezione di @KolobCanyon sono concetti di base della teoria degli insiemi. Ad esempio, un'unione sarebbe di madrelingua francese (includendo sia uomini che donne), mentre un incrocio sarebbe costituito da tutte le donne che parlano francese (esclude chiunque non parli francese ed escluda tutte le persone che non sono donne). I sindacati e le intersezioni possono essere realizzati con un numero qualsiasi di caratteristiche che definiscono ciascun set. en.wikipedia.org/wiki/Union_(set_theory) en.wikipedia.org/wiki/Intersection_(set_theory)
Katharine Osborne

6
Penso che intendi dire che dei due set "donne" e "francofoni", il sindacato sarebbe composto da tutte le donne del mondo e tutti i francofoni del mondo, un set che comprende sia donne che non parlano Uomini di lingua francese e francese. L'incrocio è, come hai scritto, solo quelle donne che parlano francese.
Teemu Leisti,

Risposte:


2628

Se si desidera abbinare solo elementi con entrambe le classi (un'intersezione, come un AND logico), basta scrivere i selettori insieme senza spazi tra:

$('.a.b')

L'ordine non è rilevante, quindi puoi anche scambiare le classi:

$('.b.a')

Quindi, per abbinare un divelemento che ha un ID di acon le classi be c, dovresti scrivere:

$('div#a.b.c')

(In pratica, molto probabilmente non hai bisogno di ottenere quello specifico, e un ID o un selettore di classe da solo è di solito abbastanza:. $('#a'))


9
@Flater: era solo per amor di esempio. Ma potrebbe essere utile se le classi be cvengono aggiunte in modo dinamico e si desidera selezionare l'elemento solo se ha quelle classi.
Sasha Chedygov,

3
Aha, buon punto :-) Fino ad ora avrei usato .hasClass () ma questa è una notazione molto migliore.
Flater

4
Questo metodo di selezione funziona anche con i CSS, ad es. .Ab {proprietà dello stile} vedi: css-tricks.com/multiple-class-id-selectors
Chris Halcrow,

30
@Shimmy: Sì. Uno spazio tra due selettori significa che stai cercando discendenti; cioè .a .bcerca elementi con classe bche sono discendenti di un elemento con classe a. Quindi qualcosa del genere div arestituirà solo gli aelementi che si trovano all'interno di un divelemento.
Sasha Chedygov,

2
@AaA: non è corretto; è stato così fin dall'inizio di jQuery, perché è così che funziona CSS. Una virgola seleziona gli elementi che corrispondono a uno dei selettori (pensalo come un OR logico), non entrambi, quindi non è la stessa cosa (anche se posso vedere come ciò possa creare confusione).
Sasha Chedygov,

174

Puoi farlo usando la filter()funzione:

$(".a").filter(".b")

16
Qual è la differenza tra questa risposta e quella accettata?
Fiume Vivian,

49
@Rice: Questo sarà un po 'più lento, perché costruirà prima un elenco di oggetti con classe "a", quindi rimuoverà tutti tranne quelli che hanno classe "b", mentre il mio lo fa in un solo passaggio. Ma per il resto, nessuna differenza.
Sasha Chedygov,

5
Questo ha funzionato per me in un'istanza in cui cercavo una classe definita come variabile, che non ha funzionato con la sintassi nel primo esempio. ad esempio: $ ('. foo'). filter (variabile). Grazie
pac

7
@pac: $ ('. foo' + variabile) avrebbe dovuto fare il trucco, ma posso vedere dove questo metodo sarebbe più chiaro in quel caso.
Sasha Chedygov,

6
Questo è anche più efficiente se hai già trovato quelli .ae hai bisogno di filtrare più volte in base a diverse classi arbitrarie che appartengono anche al .aset originale .
Qix - MONICA È STATA MISTREATA il

123

Per il caso

<element class="a">
  <element class="b c">
  </element>
</element>

Dovresti mettere uno spazio tra .ae.b.c

$('.a .b.c')

Aggiungendo alla tua risposta, vorrei sapere come accedere sia bec che il caso è il seguente: <element class = "a"> <element class = "b"> </element> <element class = "c" > </element> </element>? Attraverso $ ('. A .b.c') si ottengono risultati errati.
Ipsita Rout,

In questo esempio, $('.a .c.b')funzionerebbe anche il selettore ?
Daniel W.

Sì, poiché l'ordine non ha importanza.
Zim84,

$('.a > element')
Alex

63

Il problema che stai riscontrando è che stai usando a Group Selector, mentre dovresti usare a Multiples selector! Per essere più specifici, stai usando $('.a, .b')mentre dovresti usare $('.a.b').

Per ulteriori informazioni, vedere la panoramica dei diversi modi per combinare i selettori qui di seguito!


Selettore gruppo: ","

Seleziona tutti gli <h1>elementi E tutti gli <p>elementi E tutti gli <a>elementi:

$('h1, p, a')

Selettore multiplo: "" (nessun carattere)

Seleziona tutti gli <input>elementi di type text, con le classi codee red:

$('input[type="text"].code.red')

Selettore discendente: "" (spazio)

Seleziona tutti gli <i>elementi all'interno degli <p>elementi:

$('p i')

Selettore figlio: ">"

Seleziona tutti gli <ul>elementi che sono figli immediati di un <li>elemento:

$('li > ul')

Selettore fratello adiacente: "+"

Seleziona tutti gli <a>elementi che vengono posizionati immediatamente dopo gli <h2>elementi:

$('h2 + a')

Selettore generale di fratelli: "~"

Seleziona tutti gli <span>elementi che sono fratelli di <div>elementi:

$('div ~ span')

38

$('.a .b , .a .c').css('border', '2px solid yellow');
//selects b and c
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="a">a
  <div class="b">b</div>
  <div class="c">c</div>
  <div class="d">d</div>
</div>


26

Basta menzionare un altro caso con elemento:

Per esempio <div id="title1" class="A B C">

Basta digitare: $("div#title1.A.B.C")



20

Per prestazioni migliori è possibile utilizzare

$('div.a.b')

Questo guarderà solo attraverso gli elementi div invece di passare attraverso tutti gli elementi HTML che hai sulla tua pagina.


9

Selettore di gruppo

body {font-size: 12px; }
body {font-family: arial, helvetica, sans-serif;}
th {font-size: 12px; font-family: arial, helvetica, sans-serif;}
td {font-size: 12px; font-family: arial, helvetica, sans-serif;}

Diventa questo:

body, th, td {font-size: 12px; font-family: arial, helvetica, sans-serif;}

Quindi nel tuo caso hai provato il selettore di gruppo mentre è un'intersezione

$(".a, .b") 

invece usa questo

$(".a.b") 

4

Non è necessario jQueryper questo

In Vanillapuoi fare:

document.querySelectorAll('.a.b')

Vero nel 2018, ma non quando questa domanda è stata posta nel 2009
Michiel,

3

il tuo codice $(".a, .b")funzionerà per più elementi di seguito (contemporaneamente)

<element class="a">
<element class="b">

se si desidera selezionare un elemento con aeb entrambe le classi come <element class="a b">usare js senza coma

$('.a.b')

2

Puoi usare il getElementsByClassName()metodo per quello che vuoi.

var elems = document.getElementsByClassName("a b c");
elems[0].style.color = "green";
console.log(elems[0]);
<ul>
  <li class="a">a</li>
  <li class="a b">a, b</li>
  <li class="a b c">a, b, c</li>
</ul>

Questa è anche la soluzione più veloce. puoi vedere un benchmark su questo qui .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.