Używając zwykłego JavaScript (nie jQuery), czy jest jakiś sposób, aby sprawdzić, czy element zawiera klasę?
Obecnie robię to:
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>
Problem polega na tym, że jeśli zmienię HTML na ten ...
<div id="test" class="class1 class5"></div>
... nie ma już dokładnego dopasowania, więc domyślnie wyprowadzam nic ( ""
). Ale nadal chcę być wyjście I have class1
, ponieważ <div>
nadal zawiera w .class1
klasie.
javascript
html
css
dom
DaGUY
źródło
źródło
Odpowiedzi:
Użyj metody:
element.classList
.contains
Działa to we wszystkich aktualnych przeglądarkach, a istnieją też wielouzupełniacze obsługujące starsze przeglądarki.
Alternatywnie , jeśli pracujesz ze starszymi przeglądarkami i nie chcesz używać wielopełniaczy do ich naprawy, użycie
indexOf
jest poprawne, ale musisz go nieco poprawić:W przeciwnym razie otrzymasz także,
true
jeśli klasa, której szukasz, jest częścią innej nazwy klasy.PRÓBNY
jQuery używa podobnej (jeśli nie tej samej) metody.
Zastosowano do przykładu:
Ponieważ nie działa to razem z instrukcją switch, można osiągnąć ten sam efekt za pomocą tego kodu:
Jest również mniej zbędny;)
źródło
div
ma dwie klasy, ale generowałaby dane tylkoI have class1
podczas używaniabreak
. Jeśli chcesz wypisać każdą klasę, którą posiada element, możesz po prostu wziąćclassName
i podzielić go na białe spacje. A jaki jest twój rzeczywisty cel?Łatwym i skutecznym rozwiązaniem jest wypróbowanie metody .contains .
źródło
contains
sposób naelement.classList
własnościW nowoczesnych przeglądarkach możesz po prostu użyć
contains
metodyElement.classList
:Próbny
Obsługiwane przeglądarki
(z CanIUse.com )
Polyfill
Jeśli chcesz używać,
Element.classList
ale chcesz także obsługiwać starsze przeglądarki, rozważ użycie tej funkcji wypełniania przez Eli Gray .źródło
Ponieważ chce używać switch (), jestem zaskoczony, że nikt jeszcze tego nie ujawnił:
źródło
Element.matches ()
element.matches (selectorString)
Według MDN Web Docs :
Dlatego możesz użyć
Element.matches()
do ustalenia, czy element zawiera klasę.Zobacz kompatybilność przeglądarki
źródło
Oto mały fragment Jeśli próbujesz sprawdzić, czy element zawiera klasę, bez użycia jQuery.
Wynika to z faktu, że element może zawierać wiele nazw klas oddzielonych spacją.
LUB
Możesz także przypisać tę funkcję do prototypu elementu.
I uruchom go w następujący sposób (bardzo podobny do
.hasClass()
funkcji jQuery ):źródło
Uproszczony oneliner: 1
1
indexOf
dla tablic nie jest obsługiwany przez IE (oczywiście). W tym celu można znaleźć wiele łat małp.źródło
-
są uważane za granice słów. Np. Szukanie,foo
a klasa tofoo-bar
plonytrue
.To jest trochę stare, ale może ktoś uzna moje rozwiązanie za pomocne:
źródło
className
jest tylko łańcuchem, więc możesz użyć zwykłej funkcji indexOf, aby sprawdzić, czy lista klas zawiera inny ciąg.źródło
class
w powyższym przykładzie?foo
wynika, że ta metoda może być dość ryzykowna: zwróci prawdę, gdy będziesz szukać klasy na elemencie, który mafoobar
klasę.Znam wiele odpowiedzi, ale większość z nich dotyczy dodatkowych funkcji i dodatkowych klas. Tego osobiście używam; znacznie czystsze i znacznie mniej linii kodu!
źródło
<body class="category-page">
idocument.body.className.match('page')
- będzie pasować, alepage
do elementu nie jest przypisana żadna klasa\b
np./\bpage\b/g
, Ponieważ jest wyrażeniem regularnym (uwaga: trzeba użyć/ /g
).Oto banalne rozwiązanie bez rozróżniania wielkości liter:
źródło
Jeśli element ma tylko jedną nazwę klasy, możesz ją szybko sprawdzić, uzyskując atrybut class. Pozostałe odpowiedzi są znacznie bardziej niezawodne, ale z pewnością ma to zastosowanie.
źródło
Stworzyłem prototypową metodę, która w
classList
miarę możliwości wykorzystuje inne metodyindexOf
:Strona testowa
źródło
Sztuczka Felixa polegająca na dodawaniu spacji do flankowania nazwy klasy i szukanego ciągu jest właściwym podejściem do ustalenia, czy elementy mają klasę, czy nie.
Aby zachować różne zachowanie w zależności od klasy, możesz użyć odwołań do funkcji lub funkcji w obrębie mapy:
źródło
Chciałbym Poly wypełnić funkcjonalność classList i użyć nowej składni. W ten sposób nowsza przeglądarka będzie korzystać z nowej implementacji (która jest znacznie szybsza) i tylko stare przeglądarki przejmą wydajność od kodu.
https://github.com/remy/polyfills/blob/master/classList.js
źródło
Jest to trochę wyłączone, ale jeśli masz zdarzenie, które wyzwala zmianę, możesz obejść się bez klas:
Możesz to zrobić
.replace(/[0-9]/g, '')
usuwa cyfry zid
.Jest to nieco zhackowane, ale działa w przypadku długich przełączników bez dodatkowych funkcji lub pętli
źródło
Zobacz ten link Codepen, aby szybko i łatwo sprawdzić element, jeśli ma on określoną klasę za pomocą waniliowego JavaScript ~!
hasClass (Vanilla JS)
źródło
Jest to obsługiwane w IE8 +.
Najpierw sprawdzamy, czy
classList
istnieje, jeśli tak, możemy użyćcontains
metody obsługiwanej przez IE10 +. Jeśli korzystamy z IE9 lub 8, wraca do używania wyrażenia regularnego, które nie jest tak wydajne, ale jest zwięzłym wypełnieniem.Alternatywnie, jeśli kompilujesz z Babel, możesz po prostu użyć:
el.classList.contains(className);
źródło
Spróbuj tego:
źródło
foo-bar
i szukaszfoo
.a-zA-Z0-9_
] jako znaki słowne. Więc dla nazw klas zawierających znak minus to nie zadziała .Myślę, że będzie to idealne rozwiązanie
źródło
w którym elemencie jest obecnie klasa „.bar”? Oto inne rozwiązanie, ale to zależy od Ciebie.
demo jsfiddle
Oczywiście jest to tylko odnośnika do prostego elementu 1
<img>
(/Image/g
), ale można umieścić wszystko w tablicy jak<li>
jest/LI/g
,<ul>
=/UL/g
itd.źródło
Aby dodać do odpowiedzi dla osób próbujących znaleźć nazwy klas w ramach wbudowanych elementów SVG.
Zmień
hasCLass()
funkcję na:Zamiast korzystać z
className
właściwości, musisz użyćgetAttribute()
metody, aby pobrać nazwę klasy.źródło
Stworzyłem te funkcje na mojej stronie, używam tylko javascript waniliowy, może to komuś pomoże. Najpierw stworzyłem funkcję, aby uzyskać dowolny element HTML:
Następnie funkcja odbierająca klasę do usunięcia i selektor elementu:
Teraz możesz użyć tego w następujący sposób:
Mam nadzieję, że to pomoże.
źródło
Wskazówka: Postaraj się jak najbardziej usunąć zależności jQuery w swoich projektach - VanillaJS .
document.firstElementChild
zwraca<html>
tag, a następnieclassList
atrybut zwraca wszystkie dodane do niego klasy.źródło
Dla mnie najbardziej eleganckim i szybszym sposobem na osiągnięcie tego jest:
źródło