Usando JavaScript simples (não jQuery), existe alguma maneira de verificar se um elemento contém uma classe?
Atualmente, estou fazendo o seguinte:
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>
A questão é que, se eu mudar o HTML para este ...
<div id="test" class="class1 class5"></div>
... não há mais uma correspondência exata, então recebo a saída padrão de nothing ( ""
). Mas ainda quero que a saída seja I have class1
porque <div>
ainda contém a .class1
classe.
javascript
html
css
dom
daGUY
fonte
fonte
Respostas:
Use o método:
element.classList
.contains
Isso funciona em todos os navegadores atuais e também há polyfills para oferecer suporte a navegadores mais antigos.
Como alternativa , se você trabalha com navegadores mais antigos e não deseja usar os polyfills para corrigi-los, o uso
indexOf
é correto, mas é necessário ajustá-lo um pouco:Caso contrário, você também obterá
true
se a classe que você está procurando faz parte de outro nome de classe.DEMO
O jQuery usa um método semelhante (se não o mesmo).
Aplicado ao exemplo:
Como isso não funciona junto com a instrução switch, você pode obter o mesmo efeito com este código:
Também é menos redundante;)
fonte
div
possui duas classes, mas somente produziráI have class1
como você está usandobreak
. Se você deseja gerar todas as classes que um elemento possui, basta pegarclassName
e dividir em espaços em branco. Ou qual é o seu objetivo real?A solução fácil e eficaz é tentar o método .contains .
fonte
contains
método de umaelement.classList
propriedadeNos navegadores modernos, você pode simplesmente usar o
contains
método deElement.classList
:Demo
Navegadores suportados
(de CanIUse.com )
Polyfill
Se você deseja usar,
Element.classList
mas também deseja oferecer suporte a navegadores antigos, considere usar esse polyfill da Eli Gray .fonte
Como ele deseja usar o switch (), estou surpreso que ninguém tenha feito isso ainda:
fonte
Element.matches ()
element.matches (selectorString)
De acordo com o MDN Web Docs :
Portanto, você pode usar
Element.matches()
para determinar se um elemento contém uma classe.Exibir compatibilidade do navegador
fonte
Aqui está um pequeno trecho Se você está tentando verificar se o elemento contém uma classe, sem usar o jQuery.
Isso explica o fato de que o elemento pode conter vários nomes de classe separados por espaço.
OU
Você também pode atribuir esta função ao protótipo do elemento.
E ative-o assim (muito semelhante à
.hasClass()
função do jQuery ):fonte
Um oneliner simplificado: 1
1
indexOf
para matrizes não é suportado pelo IE (é claro). Existem muitas manchas de macacos na rede para isso.fonte
-
são considerados limites de palavras. Por exemplo, procurandofoo
e a classe éfoo-bar
rendimentostrue
.Isso é um pouco antigo, mas talvez alguém ache minha solução útil:
fonte
className
é apenas uma sequência, para que você possa usar a função indexOf regular para verificar se a lista de classes contém outra sequência.fonte
class
no exemplo acima?foo
em um elemento que a tenhafoobar
.Eu sei que existem muitas respostas, mas a maioria delas é para funções adicionais e classes adicionais. Esse é o que eu pessoalmente uso; muito mais limpo e muito menos linhas de código!
fonte
<body class="category-page">
edocument.body.className.match('page')
- irá corresponder, mas não há nenhuma classepage
anexado ao elemento\b
, por exemplo/\bpage\b/g
, uma vez que é regex (nota: precisa usar/ /g
).Aqui está uma solução trivial que não diferencia maiúsculas de minúsculas:
fonte
Se o elemento tiver apenas um nome de classe, você poderá verificar rapidamente obtendo o atributo de classe. As outras respostas são muito mais robustas, mas isso certamente tem seus casos de uso.
fonte
Eu criei um método de protótipo que usa
classList
, se possível, outro recurso paraindexOf
:Página de teste
fonte
O truque de Felix de adicionar espaços para flanquear o className e a string que você está procurando é a abordagem certa para determinar se os elementos têm a classe ou não.
Para ter um comportamento diferente de acordo com a classe, você pode usar referências de função, ou funções, dentro de um mapa:
fonte
Gostaria Poly preencher a funcionalidade classList e usar a nova sintaxe. Dessa forma, um navegador mais novo usará a nova implementação (que é muito mais rápida) e apenas navegadores antigos receberão o desempenho atingido pelo código.
https://github.com/remy/polyfills/blob/master/classList.js
fonte
Isso está um pouco errado, mas se você tiver um evento que aciona a opção, poderá ficar sem as classes:
Você pode fazer
.replace(/[0-9]/g, '')
remove dígitos deid
.É um pouco hacky, mas funciona para switches longos sem funções extras ou loops
fonte
Veja este link do Codepen para uma maneira mais rápida e fácil de verificar um elemento se ele tiver uma classe específica usando JavaScript vanilla ~!
hasClass (Vanilla JS)
fonte
Isso é suportado no IE8 +.
Primeiro, verificamos se
classList
existe. Podemos usar ocontains
método suportado pelo IE10 +. Se estivermos no IE9 ou 8, ele voltará a usar um regex, que não é tão eficiente, mas é um polyfill conciso.Como alternativa, se você estiver compilando com babel, pode simplesmente usar:
el.classList.contains(className);
fonte
Tente este:
fonte
foo-bar
e a procurafoo
.a-zA-Z0-9_
] como caracteres de palavra. Portanto, para nomes de classe contendo um caractere de menos isso não funcionará .Eu acho que a solução perfeita será essa
fonte
em qual elemento está atualmente a classe '.bar'? Aqui está outra solução, mas depende de você.
demonstração do jsfiddle
Claro que isso é apenas uma pesquisa para 1 elemento simples
<img>
(/Image/g
), mas você pode colocar tudo em uma matriz como<li>
is/LI/g
,<ul>
=/UL/g
etc.fonte
Apenas para adicionar à resposta as pessoas que tentam encontrar nomes de classes nos elementos SVG embutidos.
Mude a
hasCLass()
função para:Em vez de usar a
className
propriedade, você precisará usar ogetAttribute()
método para pegar o nome da classe.fonte
Criei essas funções para o meu site, uso apenas javascript de baunilha, talvez isso ajude alguém. Primeiro, criei uma função para obter qualquer elemento HTML:
Em seguida, a função que recebe a classe a ser removida e o seletor do elemento:
Agora você pode usá-lo assim:
Espero que ajude.
fonte
Dica: Tente remover as dependências do jQuery em seus projetos o máximo que puder - VanillaJS .
document.firstElementChild
retorna a<html>
tag, oclassList
atributo retorna todas as classes adicionadas a ela.fonte
Para mim, a maneira mais elegante e rápida de alcançá-lo é:
fonte