Voglio selezionare tutti gli elementi che hanno le due classi a
e 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.
Voglio selezionare tutti gli elementi che hanno le due classi a
e 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.
Risposte:
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 div
elemento che ha un ID di a
con le classi b
e 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')
)
b
e c
vengono aggiunte in modo dinamico e si desidera selezionare l'elemento solo se ha quelle classi.
.a .b
cerca elementi con classe b
che sono discendenti di un elemento con classe a
. Quindi qualcosa del genere div a
restituirà solo gli a
elementi che si trovano all'interno di un div
elemento.
Puoi farlo usando la filter()
funzione:
$(".a").filter(".b")
.a
e hai bisogno di filtrare più volte in base a diverse classi arbitrarie che appartengono anche al .a
set originale .
Per il caso
<element class="a">
<element class="b c">
</element>
</element>
Dovresti mettere uno spazio tra .a
e.b.c
$('.a .b.c')
$('.a .c.b')
funzionerebbe anche il selettore ?
$('.a > element')
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!
Seleziona tutti gli <h1>
elementi E tutti gli <p>
elementi E tutti gli <a>
elementi:
$('h1, p, a')
Seleziona tutti gli <input>
elementi di type
text
, con le classi code
e red
:
$('input[type="text"].code.red')
Seleziona tutti gli <i>
elementi all'interno degli <p>
elementi:
$('p i')
Seleziona tutti gli <ul>
elementi che sono figli immediati di un <li>
elemento:
$('li > ul')
Seleziona tutti gli <a>
elementi che vengono posizionati immediatamente dopo gli <h2>
elementi:
$('h2 + a')
Seleziona tutti gli <span>
elementi che sono fratelli di <div>
elementi:
$('div ~ span')
$('.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>
Soluzione JavaScript alla vaniglia: -
document.querySelectorAll('.a.b')
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.
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")
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 .