Usando JavaScript simple (no jQuery), ¿hay alguna forma de verificar si un elemento contiene una clase?
Actualmente, estoy haciendo esto:
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>
El problema es que si cambio el HTML a esto ...
<div id="test" class="class1 class5"></div>
... ya no hay una coincidencia exacta, por lo que obtengo el resultado predeterminado de nothing ( ""). Pero todavía quiero que la salida sea I have class1porque <div>todavía contiene la .class1clase.
javascript
html
css
dom
daGUY
fuente
fuente

Respuestas:
Método de uso :
element.classList.containsEsto funciona en todos los navegadores actuales y también hay polyfills para admitir navegadores más antiguos.
Alternativamente , si trabaja con navegadores antiguos y no desea usar polyfills para solucionarlos, el uso
indexOfes correcto, pero debe modificarlo un poco:De lo contrario, también obtendrá
truesi la clase que está buscando es parte de otro nombre de clase.MANIFESTACIÓN
jQuery usa un método similar (si no el mismo).
Aplicado al ejemplo:
Como esto no funciona junto con la instrucción switch, podría lograr el mismo efecto con este código:
También es menos redundante;)
fuente
divtiene dos clases, pero solo se generaráI have class1como lo está utilizandobreak. Si desea generar todas las clases que tiene un elemento, puede tomarloclassNamey dividirlo en espacios en blanco. ¿O cuál es tu objetivo real?La solución fácil y efectiva es probar el método .contains .
fuente
containsmétodo de unaelement.classListpropiedadEn los navegadores modernos, puede usar el
containsmétodo deElement.classList:Manifestación
Navegadores compatibles
(de CanIUse.com )
Polyfill
Si desea usar
Element.classListpero también desea admitir navegadores antiguos, considere usar este polyfill de Eli Gray .fuente
Como quiere usar switch (), me sorprende que nadie haya presentado esto todavía:
fuente
Element.matches ()
element.matches (selectorString)
De acuerdo con MDN Web Docs :
Por lo tanto, puede usar
Element.matches()para determinar si un elemento contiene una clase.Ver compatibilidad del navegador
fuente
Aquí hay un pequeño fragmento Si está intentando verificar si el elemento contiene una clase, sin usar jQuery.
Esto explica el hecho de que el elemento puede contener múltiples nombres de clase separados por espacio.
O
También puede asignar esta función al prototipo de elemento.
Y actívelo de esta manera (muy similar a la
.hasClass()función de jQuery ):fuente
Un oneliner simplificado: 1
1
indexOfpara matrices no es compatible con IE (por supuesto). Hay muchos parches de monos en la red para eso.fuente
-se consideran límites de las palabras. Por ejemplo, buscarfooy la clase esfoo-barrendimientostrue.Esto es un poco viejo, pero tal vez alguien encuentre útil mi solución:
fuente
classNamees solo una cadena para que pueda usar la función indexOf regular para ver si la lista de clases contiene otra cadena.fuente
classen el ejemplo anterior?fooen un elemento que tiene lafoobarclase.Sé que hay muchas respuestas, pero la mayoría de ellas son para funciones adicionales y clases adicionales. Este es el que yo personalmente uso; ¡Mucho más limpio y mucho menos líneas de código!
fuente
<body class="category-page">ydocument.body.className.match('page')coincidirá, pero no hay una clasepageasociada al elemento\b, por ejemplo/\bpage\b/g, ya que es regex (nota: tiene que usar/ /g).Aquí hay una solución trivial insensible a mayúsculas y minúsculas:
fuente
Si el elemento solo tiene un nombre de clase, puede verificarlo rápidamente obteniendo el atributo de clase. Las otras respuestas son mucho más robustas, pero esto ciertamente tiene sus casos de uso.
fuente
He creado un método prototipo que utiliza
classList, si es posible, de lo contrario recurre aindexOf:Página de prueba
fuente
El truco de Felix de agregar espacios para flanquear el className y la cadena que está buscando es el enfoque correcto para determinar si los elementos tienen la clase o no.
Para tener un comportamiento diferente según la clase, puede usar referencias de funciones, o funciones, dentro de un mapa:
fuente
Poly llenaría la funcionalidad classList y usaría la nueva sintaxis. De esta forma, los navegadores más nuevos utilizarán la nueva implementación (que es mucho más rápida) y solo los navegadores antiguos recibirán el impacto del rendimiento del código.
https://github.com/remy/polyfills/blob/master/classList.js
fuente
Esto está un poco apagado, pero si tiene un evento que desencadena el cambio, puede prescindir de las clases:
Tu puedes hacer
.replace(/[0-9]/g, '')elimina dígitos deid.Es un poco hacky, pero funciona para interruptores largos sin funciones o bucles adicionales
fuente
¡Vea este enlace de Codepen para una forma más rápida y fácil de verificar un elemento si tiene una clase específica usando JavaScript vainilla ~!
hasClass (Vanilla JS)
fuente
Esto es compatible con IE8 +.
Primero verificamos si
classListexiste, si es así, podemos usar elcontainsmétodo que es compatible con IE10 +. Si estamos en IE9 u 8, recurrir al uso de una expresión regular, que no es tan eficiente pero es un polyfill conciso.Alternativamente, si está compilando con babel, simplemente puede usar:
el.classList.contains(className);fuente
Prueba este:
fuente
foo-bary buscafoo.a-zA-Z0-9_] como caracteres de palabras. Entonces, para los nombres de clase que contienen un carácter negativo, esto no funcionará .Creo que la solución perfecta será esta
fuente
¿en qué elemento está actualmente la clase '.bar'? Aquí hay otra solución, pero depende de usted.
jsfiddle demo
Por supuesto, esto es solo una búsqueda de 1 elemento simple
<img>(/Image/g), pero puede poner todo en una matriz como<li>is/LI/g,<ul>=/UL/getc.fuente
Solo para agregar a la respuesta a las personas que intentan encontrar nombres de clase dentro de elementos SVG en línea.
Cambia la
hasCLass()función a:En lugar de utilizar la
classNamepropiedad, deberá utilizar elgetAttribute()método para obtener el nombre de la clase.fuente
Creé estas funciones para mi sitio web, solo uso JavaScript de vainilla, tal vez ayude a alguien. Primero creé una función para obtener cualquier elemento HTML:
Luego la función que recibe la clase a eliminar y el selector del elemento:
Ahora puedes usarlo así:
Espero que ayude.
fuente
Consejo: Intente eliminar las dependencias de jQuery en sus proyectos tanto como pueda: VanillaJS .
document.firstElementChilddevuelve la<html>etiqueta y elclassListatributo devuelve todas las clases agregadas a él.fuente
Para mí, la forma más elegante y rápida de lograrlo es:
fuente