En utilisant du JavaScript simple (pas jQuery), existe-t-il un moyen de vérifier si un élément contient une classe?
Actuellement, je fais ceci:
var test = document.getElementById("test");
var testClass = test.className;
switch (testClass) {
case "class1":
test.innerHTML = "I have class1";
break;
case "class2":
test.innerHTML = "I have class2";
break;
case "class3":
test.innerHTML = "I have class3";
break;
case "class4":
test.innerHTML = "I have class4";
break;
default:
test.innerHTML = "";
}
<div id="test" class="class1"></div>
Le problème est que si je change le HTML en ceci ...
<div id="test" class="class1 class5"></div>
... il n'y a plus de correspondance exacte, donc j'obtiens la sortie par défaut de Nothing ( ""
). Mais je veux toujours que la sortie soit I have class1
parce que la contient<div>
toujours la classe..class1
javascript
html
css
dom
daGUY
la source
la source
Réponses:
Utilisez la méthode:
element.classList
.contains
Cela fonctionne sur tous les navigateurs actuels et il existe également des polyfills pour prendre en charge les anciens navigateurs.
Alternativement , si vous travaillez avec des navigateurs plus anciens et que vous ne souhaitez pas utiliser de polyfills pour les corriger, l'utilisation
indexOf
est correcte, mais vous devez l'ajuster un peu:Sinon, vous obtiendrez également
true
si la classe que vous recherchez fait partie d'un autre nom de classe.DEMO
jQuery utilise une méthode similaire (sinon la même).
Appliqué à l'exemple:
Comme cela ne fonctionne pas avec l'instruction switch, vous pouvez obtenir le même effet avec ce code:
C'est aussi moins redondant;)
la source
div
a deux classes mais elle ne sortira queI have class1
lorsque vous utilisezbreak
. Si vous souhaitez afficher chaque classe d'un élément, vous pouvez simplement prendre leclassName
et le diviser sur des espaces blancs. Ou quel est votre objectif réel?La solution simple et efficace consiste à essayer la méthode .contains .
la source
contains
méthode d'uneelement.classList
propriétéDans les navigateurs modernes, vous pouvez simplement utiliser la
contains
méthode deElement.classList
:Démo
Navigateurs pris en charge
(de CanIUse.com )
Polyfill
Si vous souhaitez utiliser
Element.classList
mais que vous souhaitez également prendre en charge les navigateurs plus anciens, pensez à utiliser ce polyfill d' Eli Gray .la source
Puisqu'il veut utiliser switch (), je suis surpris que personne ne l'ait encore proposé:
la source
Element.matches ()
element.matches (selectorString)
Selon MDN Web Docs :
Par conséquent, vous pouvez utiliser
Element.matches()
pour déterminer si un élément contient une classe.Afficher la compatibilité du navigateur
la source
Voici un petit extrait Si vous essayez de vérifier si l'élément contient une classe, sans utiliser jQuery.
Cela explique le fait que l'élément peut contenir plusieurs noms de classe séparés par un espace.
OU
Vous pouvez également affecter cette fonction au prototype d'élément.
Et déclenchez-le comme ceci (très similaire à la
.hasClass()
fonction de jQuery ):la source
Un oneliner simplifié: 1
1
indexOf
pour les tableaux n'est pas pris en charge par IE (bien sûr). Il y a beaucoup de patchs de singe sur le net pour cela.la source
-
sont considérés comme des limites de mot. Par exemple, la recherchefoo
et la classe est lesfoo-bar
rendementstrue
.C'est un peu vieux, mais peut-être que quelqu'un trouvera ma solution utile:
la source
className
n'est qu'une chaîne, vous pouvez donc utiliser la fonction indexOf standard pour voir si la liste des classes contient une autre chaîne.la source
class
dans l'exemple ci-dessus?foo
sur un élément qui a lafoobar
classe.Je sais qu'il y a beaucoup de réponses mais la plupart d'entre elles concernent des fonctions supplémentaires et des classes supplémentaires. C'est celui que j'utilise personnellement; beaucoup plus propre et beaucoup moins de lignes de code!
la source
<body class="category-page">
etdocument.body.className.match('page')
- correspondra mais il n'y a pas de classepage
attachée à l'élément\b
, par exemple/\bpage\b/g
, car il est regex (note: devez utiliser/ /g
).Voici une solution triviale insensible à la casse:
la source
Si l'élément n'a qu'un seul nom de classe, vous pouvez le vérifier rapidement en obtenant l'attribut de classe. Les autres réponses sont beaucoup plus robustes mais cela a certainement ses cas d'utilisation.
la source
J'ai créé une méthode prototype qui utilise
classList
, si possible, sinon recourt àindexOf
:Page de test
la source
L'astuce de Felix d'ajouter des espaces pour encadrer le nom de classe et la chaîne que vous recherchez est la bonne approche pour déterminer si les éléments ont la classe ou non.
Pour avoir un comportement différent selon la classe, vous pouvez utiliser des références de fonction ou des fonctions dans une carte:
la source
Je voudrais que Poly remplisse la fonctionnalité classList et utilise la nouvelle syntaxe. De cette façon, les navigateurs plus récents utiliseront la nouvelle implémentation (qui est beaucoup plus rapide) et seuls les anciens navigateurs tireront les performances du code.
https://github.com/remy/polyfills/blob/master/classList.js
la source
C'est un peu éteint, mais si vous avez un événement qui déclenche le changement, vous pouvez vous passer de classes:
Tu peux faire
.replace(/[0-9]/g, '')
supprime les chiffres deid
.C'est un peu hacky, mais fonctionne pour les longs commutateurs sans fonctions supplémentaires ni boucles
la source
Voir ce lien Codepen pour un moyen plus rapide et facile de vérifier un élément s'il a une classe spécifique en utilisant JavaScript vanilla ~!
hasClass (Vanilla JS)
la source
Ceci est pris en charge sur IE8 +.
Tout d'abord, nous vérifions s'il
classList
existe, nous pouvons utiliser lacontains
méthode prise en charge par IE10 +. Si nous sommes sur IE9 ou 8, cela revient à utiliser une expression régulière, qui n'est pas aussi efficace mais qui est un polyfill concis.Alternativement, si vous compilez avec babel, vous pouvez simplement utiliser:
el.classList.contains(className);
la source
Essaye celui-là:
la source
foo-bar
et recherchezfoo
.a-zA-Z0-9_
] comme des caractères de mot. Donc, pour un nom de classe contenant un caractère moins, cela ne fonctionnera pas .Je pense que la solution parfaite sera la suivante
la source
dans quel élément se trouve actuellement la classe '.bar'? Voici une autre solution mais c'est à vous de décider.
démo jsfiddle
Bien sûr, ce n'est qu'une recherche pour 1 élément simple
<img>
(/Image/g
) mais vous pouvez tout mettre dans un tableau comme<li>
is/LI/g
,<ul>
=/UL/g
etc.la source
Juste pour ajouter à la réponse pour les personnes qui essaient de trouver des noms de classe dans des éléments SVG en ligne.
Changez la
hasCLass()
fonction en:Au lieu d'utiliser la
className
propriété, vous devrez utiliser lagetAttribute()
méthode pour récupérer le nom de la classe.la source
J'ai créé ces fonctions pour mon site Web, j'utilise uniquement du javascript vanille, cela aidera peut-être quelqu'un. J'ai d'abord créé une fonction pour obtenir n'importe quel élément HTML:
Ensuite, la fonction qui reçoit la classe à supprimer et le sélecteur de l'élément:
Vous pouvez maintenant l'utiliser comme ceci:
J'espère que cela vous aidera.
la source
Astuce: Essayez de supprimer autant que possible les dépendances de jQuery dans vos projets - VanillaJS .
document.firstElementChild
renvoie la<html>
balise puis l'classList
attribut renvoie toutes les classes qui y sont ajoutées.la source
Pour moi, le moyen le plus élégant et le plus rapide d'y parvenir est:
la source