Як я можу вибрати елемент з кількома класами в jQuery?


2060

Я хочу вибрати всі елементи, які мають два класи aі b.

<element class="a b">

Отже, лише елементи, які мають обидва класи.

Коли я користуюсь, $(".a, .b")це дає мені союз, але я хочу перетину.


2
Було б добре, якби ви могли визначити, що означають союз та перехрестя для нас новачків :)
Калоб Колоб

10
Об'єднання і перетин @KolobCanyon - основні поняття теорії множин. Так, наприклад, у спілці будуть усі французькі носії мови (включаючи чоловіків та жінок), тоді як перетином будуть усі жінки, які розмовляють французькою мовою (виключають усіх, хто не розмовляє французькою, та виключають усіх, хто не жінки). Об’єднання та перехрестя можуть бути виконані з будь-якою кількістю характеристик, що визначають кожен набір. en.wikipedia.org/wiki/Union_(set_theory) en.wikipedia.org/wiki/Intersection_(set_theory)
Katharine Osborne

6
Я думаю, ви маєте на увазі, що з двох наборів "жінки" та "французькомовні", в союзі були б усі жінки у світі та всі франкомовники у світі, що включає в себе і жінок, які не розмовляють Французькі та франкомовні чоловіки. Перехрестя - це, як ви писали, лише ті жінки, які розмовляють французькою мовою.
Теему Леісті

Відповіді:


2626

Якщо ви хочете зіставити лише елементи з обох класів (перетин, як логічний І), просто запишіть селектори разом без пробілів між ними:

$('.a.b')

Порядок не відповідає, тому ви також можете поміняти місцями класи:

$('.b.a')

Отже, щоб відповідати divелементу, який має ідентифікатор aкласу, bі cви напишете:

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

(На практиці вам, швидше за все, не потрібно розбиратись у цьому конкретному стилі, і самий селектор ID або класу зазвичай достатній:. $('#a'))


9
@Flater: Це було просто заради прикладу. Але це може бути корисно , якщо класи bі cдинамічно додається, і ви хочете тільки вибрати елемент , якщо він має ті класи.
Саша Чедигов

3
Ага, хороший момент :-) До цього часу я б використовував .hasClass (), але це набагато кращі позначення.
Flater

4
Цей метод вибору також працює для CSS , наприклад .ab {властивості стилю} см: css-tricks.com/multiple-class-id-selectors
Chris Halcrow

30
@Shimmy: Так. Пробіл між двома селекторами означає, що ви шукаєте нащадків; тобто .a .bпошук елементів з класом, bякі є нащадками елемента з класом a. Так что то вроде div aбуде повертати тільки aелементи, які в вигляді divелемента.
Саша Чедигов

2
@AaA: Це неправильно; так було з початку jQuery, тому що так працює CSS. Кома вибирає елементи, які відповідають будь-якому з селекторів (вважайте це логічним АБО), а не обидва, тому це не одне й те саме (хоча я бачу, як це може заплутатись).
Саша Чедігов

174

Це можна зробити за допомогою filter()функції:

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

16
Чим відрізняється ця відповідь від прийнятої?
Вівіан-Рівер

49
@ Райс: Цей буде трохи повільніше, тому що він спочатку створить список об'єктів класу "a", потім видалить усі, крім тих, у яких клас "b", тоді як моя робить це за один крок. Але в іншому випадку різниці немає.
Саша Чедигов

5
Це працювало для мене в тому випадку, коли я шукав клас, визначений як змінна, який не працював із синтаксисом у першому прикладі. наприклад: $ ('. foo'). filter (змінний). Дякую
pac

7
@pac: $ ('. foo' + змінна) повинна була зробити трюк, але я можу побачити, де цей метод був би зрозумілішим у такому випадку.
Саша Чедигов

6
Це також більш ефективно, якщо ви вже знайшли .aі потребуєте декількох разів відфільтрувати різні довільні класи, які також належать до вихідного .aнабору.
Qix - МОНІКА ПОМИЛИЛА

123

Для справи

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

Вам потрібно буде поставити пробіл між .aі.b.c

$('.a .b.c')

Додавши до вашої відповіді, я хотів би знати, як отримати доступ до b і c, якщо випадок наведений нижче: <element class = "a"> <element class = "b"> </element> <element class = "c" > </element> </element>? Через $ ('. A .b.c') дається неправильний результат.
Ipsita Rout

У цьому прикладі $('.a .c.b')також чи буде працювати селектор ?
Даніель В.

Так, як порядок не має значення.
Zim84

$('.a > element')
Олексій

63

Проблема у вас полягає в тому, що ви використовуєте Group Selector, тоді як ви повинні використовувати Multiples selector! Щоб бути більш конкретним, ви використовуєте, $('.a, .b')тоді як ви повинні використовувати $('.a.b').

Для отримання додаткової інформації дивіться огляд різних способів комбінування селекторів нижче!


Вибір групи: ","

Виберіть усі <h1>елементи І всі <p>елементи І всі <a>елементи:

$('h1, p, a')

Перемикач множин: "" (без символу)

Виберіть усі <input>елементи type textкласу codeта red:

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

Вибір нащадка: "" (пробіл)

Виберіть усі <i>елементи всередині <p>елементів:

$('p i')

Вибір дитини: ">"

Виберіть усі <ul>елементи, які є безпосередньо дітьми <li>елемента:

$('li > ul')

Суміжний вибір сестри: "+"

Виберіть усі <a>елементи, які розміщуються відразу після <h2>елементів:

$('h2 + a')

Загальний вибір сестри: "~"

Виберіть усі <span>елементи, які є побратимами <div>елементів:

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

Просто згадайте ще один випадок із елементом:

Напр <div id="title1" class="A B C">

Просто введіть: $("div#title1.A.B.C")



20

Для кращої продуктивності ви можете використовувати

$('div.a.b')

Це буде розглядатись лише через елементи div, замість того, щоб переглядати всі елементи html, які є на вашій сторінці.


9

Вибір групи

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

Стає таким:

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

Тож у вашому випадку ви спробували селектор групи, тоді як його перетин

$(".a, .b") 

замість цього використовуйте

$(".a.b") 

4

Вам не потрібно jQueryдля цього

У Vanillaвас можна зробити:

document.querySelectorAll('.a.b')

Щоправда, у 2018 році, але не до цього питання було задано у 2009 році
Міхель

3

ваш код $(".a, .b")буде працювати для декількох елементів (одночасно)

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

якщо ви хочете вибрати елемент, який має клас a і b обидва, <element class="a b">ніж використовувати js без коми

$('.a.b')

2

Ви можете використовувати getElementsByClassName()метод для того, що хочете.

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>

Це також найшвидше рішення. ви можете побачити орієнтир про це тут .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.