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 class1
porque <div>
todavía contiene la .class1
clase.
javascript
html
css
dom
daGUY
fuente
fuente
Respuestas:
Método de uso :
element.classList
.contains
Esto 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
indexOf
es correcto, pero debe modificarlo un poco:De lo contrario, también obtendrá
true
si 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
div
tiene dos clases, pero solo se generaráI have class1
como lo está utilizandobreak
. Si desea generar todas las clases que tiene un elemento, puede tomarloclassName
y 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
contains
método de unaelement.classList
propiedadEn los navegadores modernos, puede usar el
contains
método deElement.classList
:Manifestación
Navegadores compatibles
(de CanIUse.com )
Polyfill
Si desea usar
Element.classList
pero 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
indexOf
para 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, buscarfoo
y la clase esfoo-bar
rendimientostrue
.Esto es un poco viejo, pero tal vez alguien encuentre útil mi solución:
fuente
className
es solo una cadena para que pueda usar la función indexOf regular para ver si la lista de clases contiene otra cadena.fuente
class
en el ejemplo anterior?foo
en un elemento que tiene lafoobar
clase.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 clasepage
asociada 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
classList
existe, si es así, podemos usar elcontains
mé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-bar
y 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/g
etc.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
className
propiedad, 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.firstElementChild
devuelve la<html>
etiqueta y elclassList
atributo devuelve todas las clases agregadas a él.fuente
Para mí, la forma más elegante y rápida de lograrlo es:
fuente