Sprawdź, czy element zawiera klasę w JavaScript?

Używając zwykłego JavaScript (nie jQuery), czy istnieje sposób sprawdzenia, 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ę kod HTML na ten...

<div id="test" class="class1 class5"></div>

... nie ma już dokładnego dopasowania, więc otrzymuję domyślny wynik wynoszący nic (""). Ale nadal chcę, aby wynikiem było I have class1, ponieważ <div> nadal zawiera klasę .class1.


person daGUY    schedule 05.05.2011    source źródło
comment
element.classList.contains(cls)   -  person Ronnie Royston    schedule 09.01.2017


Odpowiedzi (30)


Użyj metody element.classList .contains:

element.classList.contains(class);

Działa to we wszystkich obecnych przeglądarkach, a istnieją także wypełnienia obsługujące starsze przeglądarki.


Alternatywnie, jeśli pracujesz ze starszymi przeglądarkami i nie chcesz używać wypełniaczy do ich naprawiania, użyj indexOf jest poprawny, ale musisz go trochę poprawić:

function hasClass(element, className) {
    return (' ' + element.className + ' ').indexOf(' ' + className+ ' ') > -1;
}

W przeciwnym razie otrzymasz również true, jeśli klasa, której szukasz, jest częścią innej nazwy klasy.

DEMO

jQuery używa podobnej (jeśli nie tej samej) metody.


W przykładzie:

Ponieważ nie działa to razem z instrukcją switch, ten sam efekt można osiągnąć za pomocą tego kodu:

var test = document.getElementById("test"),
    classes = ['class1', 'class2', 'class3', 'class4'];

test.innerHTML = "";

for(var i = 0, j = classes.length; i < j; i++) {
    if(hasClass(test, classes[i])) {
        test.innerHTML = "I have " + classes[i];
        break;
    }
}

Jest też mniej zbędny ;)

person Felix Kling    schedule 05.05.2011
comment
Świetnie, ale jak użyć tego w połączeniu z instrukcją switch, aby móc zmieniać dane wyjściowe w oparciu o klasy zawarte w elemencie div? - person daGUY; 05.05.2011
comment
@daGUY: Co w ogóle chcesz zrobić z instrukcją switch? Np. Drugi div ma dwie klasy, ale wyświetli tylko I have class1, gdy używasz break. Jeśli chcesz wypisać każdą klasę, jaką posiada element, możesz po prostu wziąć className i podzielić go na białe znaki. Albo jaki jest Twój faktyczny cel? - person Felix Kling; 05.05.2011
comment
@Felix Kling: Potrzebuję wewnętrznego HTML elementu div, aby przełączać się między czterema różnymi ciągami w zależności od zawartej w nim klasy. Właśnie użyłem Mam klasę 1 itp. jako przykładów - wszystkie prawdziwe ciągi znaków są inne. Będę pokazywał tylko jeden ciąg na raz, nie łącząc żadnego (stąd przerwy po każdym przypadku). Chcę tylko, żeby nadal działało, nawet jeśli pasująca klasa jest jedną z wielu klas w elemencie div. - person daGUY; 05.05.2011
comment
@Felix Kling: udało się, wielkie dzięki! Właściwie nie wyświetlam nazw klas, ale raczej jeden z czterech zupełnie różnych ciągów, więc zmodyfikowałem go nieco, dodając kilka instrukcji IF/ELSE IF, aby obsłużyć każdy z nich. Działa jednak idealnie. - person daGUY; 05.05.2011
comment
@daGUY: Nie ma za co. Możesz pozbyć się instrukcji if/else, jeśli po prostu utworzysz inną tablicę wiadomości, w której indeks wiadomości jest taki sam jak indeks klasy... to tylko sugestia ;) - person Felix Kling; 05.05.2011
comment
@Felix Kling: spróbuję, dzięki za sugestię! Moje umiejętności JS nie są na poziomie moich umiejętności HTML/CSS... :-) - person daGUY; 05.05.2011
comment
@Felix Kling: jedno pytanie... na końcu pierwszego wiersza zaktualizowanego kodu zamiast średnika znajduje się przecinek - czy to również deklaruje klasy jako zmienną bez konieczności ponownego wpisywania var? Zauważyłem, że kod nadal działa nawet ze średnikiem zamiast przecinka; zastanawiam się tylko jaka jest różnica. - person daGUY; 05.05.2011
comment
@daGUY: Dokładnie. Możesz użyć jednego var w ten sposób, jeśli oddzielisz deklaracje zmiennych przecinkiem. Ale powinieneś postawić średnik na końcu ostatniej deklaracji. Często robi się to, aby uczynić blok deklaracji zmiennych bardziej widocznym. - person Felix Kling; 06.05.2011
comment
FYI: w przypadku elementów svg w przeglądarkach takich jak safari nazwa_klasy nie jest ciągiem znaków, ale obiektem typu svganimatedstring. Sprawdzanie atrybutu class zamiast nazwy klasy jest obecnie najbardziej popularnym sposobem sprawdzania klasy w różnych przeglądarkach, jeśli pracujesz z elementami svg. - person CodeToad; 06.01.2014
comment
Ciekawą sztuczką z instrukcjami switch, która dobrze się tutaj sprawdzi, jest odwrócenie logiki: switch (true) { case hasClass(element,'class1'): ... break; case hasClass(element,'class2'): ... break; } - person Tian van Heerden; 23.10.2014
comment
classList to dobra decyzja. Niestety, tylko po to, aby skorzystać z już dostarczonych doskonałych informacji wygląda na to, że classList czeka na IE10. Właśnie wtedy, gdy myślałeś, że IE9 jest wystarczająco dobry, aby wywołać nowoczesną przeglądarkę, wracasz do Polyfilling tutaj (co MDN pomaga w obsłudze IE8 i 9) - person ruffin; 31.12.2015
comment
Czy jest jakiś konkretny powód, dla którego dodałeś spacje przed i po? - person Ced; 03.04.2016
comment
@Ced: dzieje się tak, aby wyszukiwanie foo nie pasowało do foobar. - person Felix Kling; 03.04.2016
comment
Dlaczego przed i po element.className jest spacja? - person Kayce Basques; 31.07.2016
comment
@KayceBasques: ponieważ dodajemy również spacje do cls, abyśmy dopasowywali tylko pełne nazwy klas. hasClass(element, 'foo') nie powinien pasować do klasy foobar. A gdybyśmy nie dodali spacji do element.className, nigdy nie moglibyśmy dopasować pierwszej lub ostatniej nazwy klasy. - person Felix Kling; 31.07.2016
comment
O, rozumiem. Jeśli klasy elementu byłyby foo bar i sprawdzałeś pod kątem ` bar ` (ponieważ dodano spacje), to nie pasowałby. Dodajesz więc spacje, aby klasy elementu stały się ` foo bar `... Dzięki - person Kayce Basques; 31.07.2016
comment
classList() działa, ale zwraca tablicę nazw klas za pomocą funkcji split(). Na przykład element ma atrybut klasy jako ‹i class='fa fa-cube fa-lg, liTmptCuboid, dldCuboidButton' title='Template Cuboid'›‹/i›, Zawartość listy 1. fa 2. fa-cube 3 .fa-lg, 4. liTmptCuboid, 5. dldCuboidButton W tym przypadku użyłem listy klas w następujący sposób: if(ev.target.classList.contains(fa-cube)) I DZIAŁAŁO. GDZIE JAK następująca lista klas NIE powiedzie się. if(ev.target.classList.contains(fa fa-cube fa-lg)). SPRAWDZENIE KODU W OKNIE DEBUGGERA TO WYJAŚNIA. - person Rahul Varadkar; 03.03.2018

Łatwym i skutecznym rozwiązaniem jest wypróbowanie metody .contains.

test.classList.contains(testClass);
person developer    schedule 28.05.2015
comment
metoda contains właściwości element.classList - person Dmitry Koroliov; 02.06.2015
comment
Uwaga! Nie jest obsługiwane we wszystkich przeglądarkach. Więcej informacji znajdziesz tutaj: caniuse.com/#feat=classlist - person Silver Ringvee; 29.03.2016
comment
To świetna odpowiedź i uważam, że funkcja .contains() ma teraz znacznie szersze wsparcie. - person Nicholas Kreidberg; 29.06.2017

W nowoczesnych przeglądarkach możesz po prostu użyć metody contains z Element.classList :

testElement.classList.contains(className)

Próbny

var testElement = document.getElementById('test');

console.log({
    'main' : testElement.classList.contains('main'),
    'cont' : testElement.classList.contains('cont'),
    'content' : testElement.classList.contains('content'),
    'main-cont' : testElement.classList.contains('main-cont'),
    'main-content' : testElement.classList.contains('main-content')
});
<div id="test" class="main main-content content"></div>


Obsługiwane przeglądarki

„tutaj

(z CanIUse.com)


Polifill

Jeśli chcesz używać Element.classList, ale chcesz także obsługiwać starsze przeglądarki, rozważ użycie tego wypełnienia autorstwa Eli Grey.

person John Slegers    schedule 20.01.2016

Element.dopasowuje()

element.matches(selectorString)

Według dokumentów internetowych MDN:

Metoda Element.matches() zwraca true jeśli element miałby zostać wybrany przez podany ciąg selektora; w przeciwnym razie zwraca false.

Dlatego możesz użyć Element.matches(), aby określić, czy element zawiera klasę.

const element = document.querySelector('#example');

console.log(element.matches('.foo')); // true
<div id="example" class="foo bar"></div>

Wyświetl zgodność przeglądarki

person Grant Miller    schedule 08.11.2018
comment
Wydaje mi się czystszy i mniej uciążliwy, chociaż jestem ciekawy, jak to się ma do wydajności. - person kasimir; 06.11.2020
comment
@kasimir .matches jest 3-4x wolniejszy. jsben.ch/iKweE - person Regular Jo; 16.06.2021

Ponieważ chce użyć funkcji switch(), dziwię się, że nikt jeszcze tego nie przedstawił:

var test = document.getElementById("test");
var testClasses = test.className.split(" ");
test.innerHTML = "";
for(var i=0; i<testClasses.length; i++) {
    switch(testClasses[i]) {
        case "class1": test.innerHTML += "I have class1<br/>"; break;
        case "class2": test.innerHTML += "I have class2<br/>"; break;
        case "class3": test.innerHTML += "I have class3<br/>"; break;
        case "class4": test.innerHTML += "I have class4<br/>"; break;
        default: test.innerHTML += "(unknown class:" + testClasses[i] + ")<br/>";
    }
}
person Thought    schedule 17.05.2012
comment
Właśnie zastanawiałem się nad tym samym, ale tak, to jest najbliższe pierwotnemu problemowi! - person Silver Ringvee; 29.03.2016

Oto mały fragment, jeśli próbujesz sprawdzić, czy element zawiera klasę, bez użycia jQuery.

function hasClass(element, className) {
    return element.className && new RegExp("(^|\\s)" + className + "(\\s|$)").test(element.className);
}

To wyjaśnia fakt, że element może zawierać wiele nazw klas oddzielonych spacją.

LUB


Możesz także przypisać tę funkcję do prototypu elementu.

Element.prototype.hasClass = function(className) {
    return this.className && new RegExp("(^|\\s)" + className + "(\\s|$)").test(this.className);
};

And trigger it like this (very similar to jQuery’s .hasClass() function):

document.getElementById('MyDiv').hasClass('active');
person Keval Bhatt    schedule 28.05.2015
comment
Bardziej wolę to rozwiązanie. Pozwala to uniknąć problemu częściowego dopasowania nazwy klasy do innej klasy i nie wymaga wypełniania pól do działania w IE. - person scoota269; 02.02.2017

To jest trochę stare, ale może komuś przyda się moje rozwiązanie:

// Fix IE's indexOf Array
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement) {
        if (this == null) throw new TypeError();
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) return -1;
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n != n) n = 0;
            else if (n != 0 && n != Infinity && n != -Infinity) n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
        if (n >= len) return -1;
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) if (k in t && t[k] === searchElement) return k;
        return -1;
    }
}
// add hasClass support
if (!Element.prototype.hasClass) {
    Element.prototype.hasClass = function (classname) {
        if (this == null) throw new TypeError();
        return this.className.split(' ').indexOf(classname) === -1 ? false : true;
    }
}
person Rafael Herscovici    schedule 28.06.2012
comment
użyj: 'element.hasClass('nazwa klasy'); - person Rafael Herscovici; 28.06.2012
comment
Dlaczego użyłeś t.length ››› 0 ? O ile wiem, użycie „0” jest błędem, prawda? - person Vitor Canova; 05.04.2013
comment
wow, tyle kodu na coś prostego. Dlaczego nie użyć wyrażeń regularnych i nie wynaleźć koła na nowo? możesz po prostu użyć /^class_name_you_are_searching_for$/.test(myElement.className) - person pqsk; 13.06.2013
comment
Za szybko to napisałem. Aby nie komplikować nadmiernie mojego wyrażenia regularnego, byłoby to /\s*nazwa_klasy_ty_szukasz_for\s*/.test(myElement.NazwaKlasy) - person pqsk; 13.06.2013
comment
@pqsk - piszę własne biblioteki do wykorzystania w przyszłości. i to po prostu dodaje do mojego stosu. oczywiście inne rozwiązania by zadziałały, to jest po prostu mój preferowany sposób - person Rafael Herscovici; 19.05.2015
comment
@Dementic bardzo prawdziwe. Każdemu swoje. Każdy, kto wejdzie na tę stronę, nie może powiedzieć, że nie ma wyboru :) - person pqsk; 19.05.2015

className to tylko ciąg znaków, więc możesz użyć zwykłej funkcji indexOf, aby sprawdzić, czy lista klas zawiera inny ciąg.

person David    schedule 05.05.2011
comment
A co z testowaniem klasy class w powyższym przykładzie? - person Felix Kling; 05.05.2011
comment
Z doświadczenia wynika, że ​​ta metoda może być dość ryzykowna: zwróci wartość true, gdy będziesz szukać klasy foo w elemencie, który ma klasę foobar. - person Zirak; 05.05.2011
comment
Jasne, po prostu musisz być świadomy tego, co testujesz. Kod Felixa działa dobrze, używając spacji jako separatora. - person David; 05.05.2011
comment
Nie uwzględnia zagnieżdżonych wystąpień nazwy klasy. Przykład: „end” można znaleźć w nazwie klasy „frontend”. - person Anthony Rutledge; 04.06.2016

Uproszczony oneliner:1

function hasClassName(classname,id) {
 return  String ( ( document.getElementById(id)||{} ) .className )
         .split(/\s/)
         .indexOf(classname) >= 0;
}

1 indexOf dla tablic nie jest obsługiwany przez IE (oczywiście). W sieci można znaleźć wiele łatek małp, które służą temu celowi.

person KooiInc    schedule 05.05.2011
comment
Problem z granicami słów polega na tym, że niektóre prawidłowe znaki w nazwach klas, takie jak -, są uważane za granice słów. Np. szukanie foo i klasa to foo-bar daje true. - person Felix Kling; 05.05.2011
comment
Masz rację. Usunięto oryginał, dodano inne podejście. Nadal oneliner. - person KooiInc; 05.05.2011

Wiem, że jest wiele odpowiedzi, ale większość z nich dotyczy dodatkowych funkcji i dodatkowych klas. To jest ten, którego osobiście używam; znacznie czystsze i znacznie mniej linii kodu!

if( document.body.className.match('category-page') ) { 
  console.log('yes');
}
person TheBlackBenzKid    schedule 21.12.2015
comment
ta metoda może zwracać fałszywe wyniki podczas wyszukiwania nazwy klasy, która częściowo pasuje - np. <body class="category-page"> i document.body.className.match('page') - będzie pasować, ale do elementu nie jest dołączona żadna klasa page - person hooblei; 07.03.2016
comment
Można rozwiązać za pomocą \b, np. /\bpage\b/g, ponieważ jest to wyrażenie regularne (uwaga: należy użyć / /g). - person Andrew; 05.07.2019

Stworzyłem prototypową metodę, która używa classList, jeśli to możliwe, w przeciwnym razie ucieka się do indexOf:

Element.prototype.hasClass = Element.prototype.hasClass || 
  function(classArr){
    var hasClass = 0,
        className = this.getAttribute('class');
  
    if( this == null || !classArr || !className ) return false;
  
    if( !(classArr instanceof Array) )
      classArr = classArr.split(' ');

    for( var i in classArr )
      // this.classList.contains(classArr[i]) // for modern browsers
      if( className.split(classArr[i]).length > 1 )  
          hasClass++;

    return hasClass == classArr.length;
};


///////////////////////////////
// TESTS (see browser's console when inspecting the output)

var elm1 = document.querySelector('p');
var elm2 = document.querySelector('b');
var elm3 = elm1.firstChild; // textNode
var elm4 = document.querySelector('text'); // SVG text

console.log( elm1, ' has class "a": ', elm1.hasClass('a') );
console.log( elm1, ' has class "b": ', elm1.hasClass('b') );
console.log( elm1, ' has class "c": ', elm1.hasClass('c') );
console.log( elm1, ' has class "d": ', elm1.hasClass('d') );
console.log( elm1, ' has class "a c": ', elm1.hasClass('a c') );
console.log( elm1, ' has class "a d": ', elm1.hasClass('a d') );
console.log( elm1, ' has class "": ', elm1.hasClass('') );

console.log( elm2, ' has class "a": ', elm2.hasClass('a') );

// console.log( elm3, ' has class "a": ', elm3.hasClass('a') );

console.log( elm4, ' has class "a": ', elm4.hasClass('a') );
<p class='a b c'>This is a <b>test</b> string</p>
<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="50px">
    <text x="10" y="20" class='a'>SVG Text Example</text>
</svg>

Strona testowa

person vsync    schedule 14.10.2014
comment
Czy istnieje powód, dla którego chciałbyś używać listy klas zamiast indeksu e.className? Wygląda na to, że wydajność jest gorsza - person Ced; 03.04.2016
comment
@Ced - cóż, perf nie ma znaczenia, jeśli nie testujesz tysięcy elementów dla ich klasy (prawdopodobnie w przyszłości zostanie to refaktoryzowane w przeglądarkach). jest bardziej elegancki w użyciu, ponieważ kod opisuje jego funkcjonalność, ale w ostatecznym rozrachunku to nie ma znaczenia, rób, co chcesz :) - person vsync; 03.04.2016

Oto trywialne rozwiązanie nieuwzględniające wielkości liter:

function hasClass(element, classNameToTestFor) {
    var classNames = element.className.split(' ');
    for (var i = 0; i < classNames.length; i++) {
        if (classNames[i].toLowerCase() == classNameToTestFor.toLowerCase()) {
            return true;
        }
    }
    return false;
}
person Anders Fjeldstad    schedule 05.05.2011

  1. Sztuczka Felixa polegająca na dodawaniu spacji po obu stronach nazwy klasy i szukanego ciągu znaków jest właściwym podejściem do określenia, czy elementy mają daną klasę, czy nie.

  2. Aby zachować się inaczej w zależności od klasy, możesz użyć odwołań do funkcji lub funkcji na mapie:

    function fn1(element){ /* code for element with class1 */ }
    
    function fn2(element){ /* code for element with class2 */ }
    
    function fn2(element){ /* code for element with class3 */ }
    
    var fns={'class1': fn1, 'class2': fn2, 'class3': fn3};
    
    for(var i in fns) {
        if(hasClass(test, i)) {
            fns[i](test);
        }
    }
    
    • for(var i in fns) iterates through the keys within the fns map.
    • Brak przerwy po fnsi umożliwia wykonanie kodu za każdym razem, gdy wystąpi dopasowanie - więc jeśli element ma f.i, klasę 1 i klasę 2, zostaną wykonane zarówno fn1, jak i fn2.
    • Zaletą tego podejścia jest to, że kod do wykonania dla każdej klasy jest dowolny, podobnie jak ten w instrukcji switch; w twoim przykładzie wszystkie przypadki wykonały podobną operację, ale jutro może być konieczne wykonanie innych czynności dla każdego z nich.
    • Możesz symulować przypadek domyślny, mając zmienną stanu informującą, czy w pętli znaleziono dopasowanie, czy nie.
person entonio    schedule 05.05.2011

Jeśli element ma tylko jedną nazwę klasy, możesz to szybko sprawdzić, pobierając atrybut class. Inne odpowiedzi są znacznie solidniejsze, ale z pewnością ma to swoje przypadki użycia.

if ( element.getAttribute('class') === 'classname' ) {

}
person Brandon Brule    schedule 17.01.2015

Jest to obsługiwane w IE8+.

Najpierw sprawdzamy, czy classList istnieje. Jeśli tak, możemy użyć metody contains obsługiwanej przez IE10+. Jeśli korzystamy z IE9 lub 8, wracamy do używania wyrażenia regularnego, które nie jest tak wydajne, ale jest zwięzłym wypełnieniem.

if (el.classList) {
  el.classList.contains(className);
} else {
  new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
}

Alternatywnie, jeśli kompilujesz za pomocą Babel, możesz po prostu użyć: el.classList.contains(className);

person Buts    schedule 24.07.2018

Aby sprawdzić, czy element zawiera klasę, użyj metody zawiera() właściwości classList elementu:*

element.classList.contains(className);

*Załóżmy, że masz następujący element:

<div class="secondary info">Item</div>*

Aby sprawdzić, czy element zawiera klasę dodatkową, użyj następującego kodu:

 const div = document.querySelector('div');
 div.classList.contains('secondary'); // true

Poniższe zwraca wartość false, ponieważ element nie zawiera błędu klasy:

 const div = document.querySelector('div');
 div.classList.contains('error'); // false
person Berkay    schedule 11.01.2021

Myślę, że idealnym rozwiązaniem będzie to

if ($(this).hasClass("your_Class")) 
    alert("positive");            
else              
    alert("Negative");
person Abhishek    schedule 06.01.2014
comment
1. Używanie zwykłego JavaScript (nie jQuery) 2. Użyj nawiasów - person nkmol; 06.01.2014
comment
3 - użyj nawiasu - person TheBlackBenzKid; 07.08.2017

Chciałbym, aby 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 starsze przeglądarki przejmą spadek wydajności z kodu.

https://github.com/remy/polyfills/blob/master/classList.js

person Eric Young    schedule 15.01.2014

To trochę nie tak, ale jeśli masz zdarzenie, które uruchamia przełącznik, możesz obejść się bez klas:

<div id="classOne1"></div>
<div id="classOne2"></div>
<div id="classTwo3"></div>

Możesz to zrobić

$('body').click( function() {

    switch ( this.id.replace(/[0-9]/g, '') ) {
        case 'classOne': this.innerHTML = "I have classOne"; break;
        case 'classTwo': this.innerHTML = "I have classTwo"; break;
        default: this.innerHTML = "";
    }

});

.replace(/[0-9]/g, '') usuwa cyfry z id.

Jest to trochę hacky, ale działa w przypadku długich przełączników bez dodatkowych funkcji i pętli

person Arthur Tarasov    schedule 19.07.2017

Zobacz ten link do Codepen, aby szybciej i łatwo sprawdzić element, czy ma on określoną klasę, używając waniliowego JavaScript~!

hasClass (Vanilla JS)

function hasClass(element, cls) {
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
person Jefsama    schedule 02.10.2017

Korzystanie z listy klas jest również idealne

HTML

<div id="box" class="myClass"></div>

JavaScript

const element = document.querySelector("#box");

element.classList.contains("myClass");
person Abdellah Ramadan    schedule 09.10.2020

Jak sugeruje zaakceptowana odpowiedź, Element.className zwraca ciąg znaków, więc możesz łatwo sprawdzić, czy klasa istnieje, używając metody indexOf():

element.className.indexOf('animated') > -1

Jeśli interesuje Cię różnica w wydajności między indexOf a classList.contains, użycie indexOf wydaje się nieco szybsze. Aby to sprawdzić, przeprowadziłem szybki test porównawczy wydajności. Oto moje ustalenia: ClassName.indexOf vs ClassList.contains.

person Badan    schedule 10.02.2021

Na to pytanie dość solidnie odpowiedział element.classList.contains(), ale ludzie wykazali się dość ekstrawaganckimi odpowiedziami i wysunęli odważne twierdzenia, więc przeprowadziłem test porównawczy.

Pamiętaj, że każdy test wykonuje 1000 iteracji, więc większość z nich jest nadal bardzo szybka. Jeśli nie będziesz w dużym stopniu na tym polegać w przypadku konkretnej operacji, nie zobaczysz różnicy w wydajności.

Przeprowadziłem kilka testów, w zasadzie na wszystkie sposoby, aby to zrobić. Na moim komputerze (Win 10, 24 GB, i7-8700) plik classList.contains działał znakomicie. To samo dotyczy className.split(' '), która w rzeczywistości jest taka sama.

Zwycięzcą jest jednak classList.contains(). Jeśli nie sprawdzasz, czy lista klas ma wartość undefined, ~(' ' + v.className + ' ').indexOf(' c' + i + ' ') przesuwa się do przodu o 5-15%

tutaj wprowadź opis obrazu

person Regular Jo    schedule 16.06.2021

Spróbuj tego:

document.getElementsByClassName = function(cl) {
   var retnode = [];
   var myclass = new RegExp('\\b'+cl+'\\b');
   var elem = this.getElementsByTagName('*');
   for (var i = 0; i < elem.length; i++) {
       var classes = elem[i].className;
       if (myclass.test(classes)) retnode.push(elem[i]);
   }
    return retnode;
};
person jimy    schedule 05.05.2011
comment
Uważaj na granicę słowa. Będzie to również pasować do true, jeśli masz np. klasę foo-bar i wyszukaj foo. - person Felix Kling; 05.05.2011
comment
Cześć Jimy, więc szukałem tego \b metaznaku i uwzględnia on tylko [a-zA-Z0-9_ ] jako znaki słowne. Zatem dla nazw klas zawierających znak minus to nie zadziała. - person Stano; 12.06.2013

w którym elemencie znajduje się obecnie klasa „.bar”? Oto inne rozwiązanie, ale to zależy od Ciebie.

var reg = /Image/g, // regexp for an image element
query = document.querySelector('.bar'); // returns [object HTMLImageElement]
query += this.toString(); // turns object into a string

if (query.match(reg)) { // checks if it matches
  alert('the class .bar is attached to the following Element:\n' + query);
}

Demo jsfiddle

Oczywiście jest to tylko wyszukiwanie 1 prostego elementu <img>(/Image/g), ale możesz umieścić wszystko w tablicy, np. <li> to /LI/g, <ul> = /UL/g itd.

person Thielicious    schedule 05.07.2016

Aby dodać do odpowiedzi dla osób próbujących znaleźć nazwy klas w wbudowanych elementach SVG.

Zmień funkcję hasCLass() na:

function hasClass(element, cls) {
    return (' ' + element.getAttribute('class') + ' ').indexOf(' ' + cls + ' ') > -1;
  }

Zamiast używać właściwości className, będziesz musiał użyć metody getAttribute(), aby pobrać nazwę klasy.

person Ben Rudolph    schedule 25.07.2018

Stworzyłem te funkcje dla mojej witryny, używam tylko waniliowego JavaScript, może komuś to pomoże. Najpierw stworzyłem funkcję pobierającą dowolny element HTML:

//return an HTML element by ID, class or tag name
    var getElement = function(selector) {
        var elements = [];
        if(selector[0] == '#') {
            elements.push(document.getElementById(selector.substring(1, selector.length)));
        } else if(selector[0] == '.') {
            elements = document.getElementsByClassName(selector.substring(1, selector.length));
        } else {
            elements = document.getElementsByTagName(selector);
        }
        return elements;
    }

Następnie funkcja odbierająca klasę do usunięcia i selektor elementu:

var hasClass = function(selector, _class) {
        var elements = getElement(selector);
        var contains = false;
        for (let index = 0; index < elements.length; index++) {
            const curElement = elements[index];
            if(curElement.classList.contains(_class)) {
                contains = true;
                break;
            }
        }
        return contains;
    }

Teraz możesz go używać w ten sposób:

hasClass('body', 'gray')
hasClass('#like', 'green')
hasClass('.button', 'active')

Mam nadzieję, że to pomoże.

person Josh    schedule 27.11.2019

Wskazówka: staraj się w miarę możliwości usuwać zależności jQuery ze swoich projektów - VanillaJS.

document.firstElementChild zwraca znacznik <html>, a atrybut classList zwraca wszystkie dodane do niego klasy.

if(document.firstElementChild.classList.contains("your-class")){
    // <html> has 'your-class'
} else {
    // <html> doesn't have 'your-class'
}
person Alireza    schedule 13.02.2020

Ponieważ .className jest ciągiem znaków, możesz użyć metody ciągu includes(), aby sprawdzić, czy Twój .className zawiera nazwę Twojej klasy:

element.className.includes("class1")
person Majora    schedule 25.07.2020

Dla mnie najbardziej eleganckim i najszybszym sposobem na osiągnięcie tego jest:

function hasClass(el, cl) {
        return el.classList ? el.classList.contains(cl) : !!el.className && !!el.className.match(new RegExp('(?: |^)' + cl + '(?: |$)'));
    }

tutaj wprowadź opis obrazu

person Pinonirvana    schedule 30.05.2018
comment
Po pierwsze, to wyrażenie regularne nie jest całkowicie niezawodne ani wydajne. (Grupa przechwytująca) jest niepotrzebna. Powinieneś użyć (?: |^)c'+i+'(?: |$). Po drugie, nie jest to najszybsze. jsben.ch/QAOQs - person Regular Jo; 16.06.2021
comment
@RegularJo Przeprowadzam twój test, ale dla mnie wynika, że ​​wyrażenie regularne jest najszybsze - person Pinonirvana; 16.06.2021
comment
@RegularJo również c w twoim wyrażeniu regularnym jest błędne, poprawne wyrażenie regularne to „(?: |^)”+i+”(?: |$)” - person Pinonirvana; 16.06.2021
comment
Lol, tak, zapomniałem zaktualizować moje wyrażenie regularne z testu, aby zmienić c z powrotem. - person Regular Jo; 16.06.2021