How to get elements with multiple classes
Asked Answered
S

7

263

Say I have this:

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

How do I select this div element?

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

That does not work.

I know that, in jQuery, it is $('.class1.class2'), but I'd like to select it with vanilla JavaScript.

Solidago answered 25/8, 2011 at 2:44 Comment(0)
C
374

AND (both classes)

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

OR (at least one class)

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

XOR (one class but not the other)

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

NAND (not both classes)

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

NOR (not any of the two classes)

var list = document.querySelectorAll(":not(.class1):not(.class2)");
Choreography answered 19/12, 2019 at 9:19 Comment(2)
var list = document.querySelector('.remove_fields.dynamic, .remove_fields.existing') To get the element if it has any of the combination is present but not both.Mop
I just want to add something along with every other answers. If you want to select elements of specific tag type, for examle <img>, that belongs to mulitple classes then you can specify the tag name along with the class names in querySelectorAll() in the following format document.querySelectorAll("tagname.class1.class2.class3")Statecraft
E
235

It's actually very similar to jQuery:

document.getElementsByClassName('class1 class2')

MDN Doc getElementsByClassName

Engineer answered 25/8, 2011 at 2:47 Comment(3)
what about getting element with only one class , which is the one specified @EngineerPubilis
as I remember the classes comes without "." document.getElementsByClassName('class1 class2')Darned
In the given MDN link, dot is not used before class names in getElements parameter. I checked this on firefox as well as chrome and it worked without dots, but not with dots.Violante
V
52

querySelectorAll with standard class selectors also works for this.

document.querySelectorAll('.class1.class2');
Voltcoulomb answered 26/5, 2016 at 1:48 Comment(3)
That doesn't work, it needs to be document.querySelectorAll('.class1, .class2');Undenominational
@Undenominational your selector would capture elements with .class1 OR .class2, while the one above would only capture elements with both classes and does in fact work. See the console output of this test: jsfiddle.net/0ph1p9p2Voltcoulomb
Ok, my bad, I misunderstood what the OP wanted to do. But IMO a more typical use case is to want to select elements which have either class or both, in which case my example is what you want.Undenominational
F
22

As @filoxo said, you can use document.querySelectorAll.

If you know that there is only one element with the class you are looking for, or you are interested only in the first one, you can use:

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

BTW, while .class1.class2 indicates an element with both classes, .class1 .class2 (notice the whitespace) indicates an hierarchy - and element with class class2 which is inside en element with class class1:

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

And if you want to force retrieving a direct child, use > sign (.class1 > .class2):

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

For entire information about selectors:
https://www.w3schools.com/jquery/jquery_ref_selectors.asp

Funicle answered 20/10, 2017 at 9:0 Comment(0)
S
2

Okay this code does exactly what you need:

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();

Hope it helps! ;)

Stubby answered 6/8, 2018 at 14:7 Comment(0)
T
1

html

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

javascritp code

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

The querySelectorAll() method returns all elements in the document that matches a specified CSS selector(s), as a static NodeList object.

The NodeList object represents a collection of nodes. The nodes can be accessed by index numbers. The index starts at 0.

also learn more about https://www.w3schools.com/jsref/met_document_queryselectorall.asp

== Thank You ==

Telfer answered 18/7, 2018 at 5:50 Comment(0)
B
0

actually @bazzlebrush 's answer and @filoxo 's comment helped me a lot.

I needed to find the elements where the class could be "zA yO" OR "zA zE"

Using jquery I first select the parent of the desired elements:

(a div with class starting with 'abc' and style != 'display:none')

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

then the desired children of that element:

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

works perfectly! note you don't have to do document.querySelector you can as above pass in a pre-selected object.

Bedight answered 30/4, 2017 at 21:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.