Comment obtenir des éléments avec plusieurs classes

135

Dis que j'ai ceci:

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

Comment sélectionner cet divélément?

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

Cela ne fonctionne pas.

Je sais que, dans jQuery, c'est le cas $('.class1.class2'), mais j'aimerais le sélectionner avec du JavaScript vanilla.

Nathan Prométhée
la source

Réponses:

183

C'est en fait très similaire à jQuery:

document.getElementsByClassName('class1 class2')

MDN Doc getElementsByClassName

Joe
la source
Qu'en est-il d'obtenir un élément avec une seule classe, qui est celle spécifiée @Joe
CodeGuru
1
comme je me souviens, les cours sont livrés sans "." document.getElementsByClassName ('class1 class2')
Misha Beskin
2
Dans le lien MDN donné, le point n'est pas utilisé avant les noms de classe dans le paramètre getElements. J'ai vérifié cela sur Firefox ainsi que Chrome et cela a fonctionné sans points, mais pas avec des points.
Gaurav Singh
41

ET (les deux classes)

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

OU (au moins une classe)

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

XOR (une classe mais pas l'autre)

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

NAND (pas les deux classes)

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

NOR (aucune des deux classes)

var list = document.querySelectorAll(":not(.class1):not(.class2)");
Bleu amer
la source
C'est fantastique. Devrait être top.
Hackstaar
37

querySelectorAll avec des sélecteurs de classe standard fonctionne également pour cela.

document.querySelectorAll('.class1.class2');
filoxo
la source
2
Cela ne fonctionne pas, ça doit être document.querySelectorAll('.class1, .class2');
bazzlebrush
9
@bazzlebrush votre sélecteur capturerait des éléments avec .class1OR .class2, tandis que celui ci-dessus ne capturerait que les éléments avec les deux classes et fonctionne en fait. Voir la sortie console de ce test: jsfiddle.net/0ph1p9p2
filoxo
Ok, mon mauvais, j'ai mal compris ce que l'OP voulait faire. Mais IMO, un cas d'utilisation plus typique est de vouloir sélectionner des éléments qui ont une classe ou les deux, auquel cas mon exemple est ce que vous voulez.
bazzlebrush
12

Comme @filoxo l'a dit, vous pouvez utiliser document.querySelectorAll.

Si vous savez qu'il n'y a qu'un seul élément avec la classe que vous recherchez, ou que vous n'êtes intéressé que par le premier, vous pouvez utiliser:

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

BTW, tandis .class1.class2qu'indique un élément avec les deux classes, .class1 .class2(notez l'espace blanc) indique une hiérarchie - et un élément avec une classe class2qui est à l'intérieur d'un élément avec une classe class1:

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

Et si vous voulez forcer la récupération d'un enfant direct, utilisez >sign ( .class1 > .class2):

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

Pour des informations complètes sur les sélecteurs:
https://www.w3schools.com/jquery/jquery_ref_selectors.asp

guyaloni
la source
1

html

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

code javascritp

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

La méthode querySelectorAll () renvoie tous les éléments du document qui correspondent à un ou plusieurs sélecteurs CSS spécifiés, sous la forme d'un objet NodeList statique.

L'objet NodeList représente une collection de nœuds. Les nœuds sont accessibles par des numéros d'index. L'index commence à 0.

en savoir plus sur https://www.w3schools.com/jsref/met_document_queryselectorall.asp

== Merci ==

Md. Abu Sayed
la source
1

Ok, ce code fait exactement ce dont vous avez besoin:

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

J'espère que ça aide! ;)

Gabriel Marques
la source
0

en fait, la réponse de @bazzlebrush et le commentaire de @filoxo m'ont beaucoup aidé.

J'avais besoin de trouver les éléments où la classe pourrait être "zA yO" OU "zA zE"

En utilisant jquery, je sélectionne d'abord le parent des éléments souhaités:

(un div avec une classe commençant par 'abc' et style! = 'display: none')

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

puis les enfants souhaités de cet élément:

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

fonctionne parfaitement! notez que vous n'avez pas à faire document.querySelector, vous pouvez comme ci-dessus passer dans un objet présélectionné.

user2677034
la source