Як отримати елементи з кількома класами


133

Скажіть, у мене це:

<div class="class1 class2"></div>

Як вибрати цей divелемент?

document.getElementsByClassName('class1')[0].getElementsByClassName('class2')[0]

Це не працює.

Я знаю, що в jQuery це так $('.class1.class2'), але я хотів би вибрати його за допомогою ванільного JavaScript.

Відповіді:


182

Він насправді дуже схожий на jQuery:

document.getElementsByClassName('class1 class2')

MDN Doc getElementsByClassName


як щодо отримання елемента лише з одним класом, який вказаний @Joe
CodeGuru

1
наскільки я пам'ятаю, заняття проходять без "". document.getElementsByClassName ('class1 class2')
Міша Бескін

2
У даному посиланні MDN крапка не використовується перед іменами класів у параметрі getElements. Я перевірив це на Firefox, а також на хромі, і він працював без крапок, але не з крапками.
Гаурав Сінгх

39

І (обидва класи)

var list = document.getElementsByClassName("class1 class2");
var list = document.querySelectorAll(".class1.class2");

АБО (принаймні один клас)

var list = document.querySelectorAll(".class1,.class2");

XOR (один клас, але не інший)

var list = document.querySelectorAll(".class1:not(.class2),.class2:not(.class1)");

NAND (не обидва класи)

var list = document.querySelectorAll(":not(.class1),:not(.class2)");

NOR (не будь-який з двох класів)

var list = document.querySelectorAll(":not(.class1):not(.class2)");

Це фантастично. Повинно бути зверху.
Hackstaar

36

querySelectorAll зі стандартними селекторами класу також працює для цього.

document.querySelectorAll('.class1.class2');

2
Це не працює, це повинно бути document.querySelectorAll('.class1, .class2');
пензлик

9
@bazzlebrush ваш селектор збирає елементи за допомогою .class1АБО .class2, тоді як той, що перерахований вище, охоплював би лише елементи обох класів і справді спрацьовує. Дивіться консольний вихід цього тесту: jsfiddle.net/0ph1p9p2
filoxo

Гаразд, погано, я неправильно зрозумів, що хотів зробити ОП. Але для ІМО більш типовим випадком використання є бажання вибрати елементи, які мають або клас, або обидва, і в цьому випадку мій приклад - те, що ви хочете.
пензлик

12

Як сказав @filoxo, ви можете використовувати document.querySelectorAll.

Якщо ви знаєте, що з класом, який ви шукаєте, є лише один елемент, або вас цікавить лише перший, ви можете використовувати:

document.querySelector('.class1.class2');

BTW, хоча .class1.class2вказує на елемент обох класів, .class1 .class2(помічайте пробіл) вказує ієрархію - і елемент з класом, class2який знаходиться всередині en елемента з класом class1:

<div class='class1'>
  <div>
    <div class='class2'>
      :
      :

І якщо ви хочете змусити отримати пряму дитину, використовуйте >знак ( .class1 > .class2):

<div class='class1'>
  <div class='class2'>
    :
    :

Повна інформація про селектори:
https://www.w3schools.com/jquery/jquery_ref_selectors.asp


1

html

<h2 class="example example2">A heading with class="example"</h2>

код javascritp

var element = document.querySelectorAll(".example.example2");
element.style.backgroundColor = "green";

Метод querySelectorAll () повертає всі елементи в документі, які відповідають вказаним селекторам (-ям) CSS, як статичний об'єкт NodeList.

Об'єкт NodeList являє собою сукупність вузлів. До вузлів можна отримати доступ за номерами індексу. Індекс починається з 0.

також дізнайтеся більше про https://www.w3schools.com/jsref/met_document_queryselectorall.asp

== Дякую ==


1

Гаразд, цей код робить саме те, що вам потрібно:

HTML:

<div class="class1">nothing happens hear.</div>

<div class="class1 class2">This element will receive yout code.</div>

<div class="class1">nothing happens hear.</div>

JS:

function getElementMultipleClasses() {
    var x = document.getElementsByClassName("class1 class2");
    x[0].innerHTML = "This is the element you want";
}
getElementMultipleClasses();

Сподіваюся, це допомагає! ;)


0

насправді відповідь @bazzlebrush та коментар @filoxo мені дуже допомогли.

Мені потрібно було знайти елементи, де клас міг би бути "zA yO" АБО "zA zE"

Використовуючи jquery, я спочатку вибираю батько потрібних елементів:

(div з класом, що починається з 'abc' та style! = 'display: none')

var tom = $('div[class^="abc"][style!="display: none;"]')[0];                   

то бажані діти цього елемента:

var ax = tom.querySelectorAll('.zA.yO, .zA.zE');

працює чудово! зауважте, що вам не потрібно робити document.querySelector, який ви можете передати вищезазначеному об'єкту.

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