Düz JavaScript ile “hasClass” işlevi nedir?


313

JQuery's hasClassdüz ol 'JavaScript ile nasıl? Örneğin,

<body class="foo thatClass bar">

Sormak için JavaScript yolu nedir <body>vardır thatClass?


class(Birden çok sınıf durumunda bir boşlukla ayrılmış rasgele sırayla birden çok sınıf adı olacak) özelliği ayrıştırmak ve sınıf adınızın içinde olup olmadığını kontrol etmek için varsayalım . Çok zor değil, ama öğrenme amaçlı değilse hala çok rahatsız edici :)
Pekka

7
Partiden ama jQuery işlevlerine alternatifler sunuyor iyi site için geç kalırsam bilmiyorum youmightnotneedjquery.com
Ithil

Yanıtlar:


116

Eşleşip element.classNameeşleşmediğini kontrol edebilirsiniz /\bthatClass\b/.
\bbir kelime sonu ile eşleşir.

Veya jQuery'nin kendi uygulamasını kullanabilirsiniz:

var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 ) 

Daha genel sorunuzu cevaplamak için , jQuery'nin github'daki kaynak koduna veya hasClassözellikle bu kaynak görüntüleyicinin kaynağına bakabilirsiniz .


6
JQuery uygulaması için +1 (yukarıya baktığınız için (bu uygun İngilizce mi?)) rclass;);
Felix Kling

6
Olmaz \b"thatClass-anotherClass" maç?
Matthew Crumley

3
sadece bütünlük için: son sürümlerde rclass "/ [\ n \ t \ r] / g" (\ r eklendi)
Felix Schwarz

4
@FelixSchwarz haklı, mevcut jQuery'de normal ifade güncellendi /[\t\r\n\f]/g. Ayrıca eksi işareti /\bclass\b/olan sınıf isimleri için başarısız olabileceğinden (iyi çalışıyor dışında) bahsetmek iyi olur -, bu yüzden jQuery'nin uygulaması daha iyi ve daha güvenilirdir. Örneğin: /\bbig\b/.test('big-text')beklenen yanlış yerine true değerini döndürür.
Stano

996

Basitçe kullanın classList.contains():

if (document.body.classList.contains('thatClass')) {
    // do some stuff
}

Diğer kullanım alanları classList:

document.body.classList.add('thisClass');
// $('body').addClass('thisClass');

document.body.classList.remove('thatClass');
// $('body').removeClass('thatClass');

document.body.classList.toggle('anotherClass');
// $('body').toggleClass('anotherClass');

Tarayıcı Desteği:

  • Chrome 8.0
  • Firefox 3.6
  • IE 10
  • Opera 11.50
  • Safari 5.1

classList Tarayıcı Desteği


5
IE8'de desteklenmez . IE8 .classListbir dize olarak alabilirsiniz , ancak gibi daha modern yöntemleri tanımayacak.classList.contains()
iono

7
@iono MDN'nin Element.classList uygulama açıklamasında, bu davranışa desteği IE8 developer.mozilla.org/en-US/docs/Web/API/Element/classList
James

3
@AlexanderWigmore ile hemfikirim, bu inanılmaz derecede faydalı ve basitti.
Jacques Olivier

Buna oy verin. Bu, sınıfları sorgulamanın çok daha temiz bir yoludur
user2190488

@SLs bu kabul edilen cevap olacak şekilde güncellenmelidir.
Umur Karagöz

35

En etkili tek astar

  • bir boole döndürür (Orbling'in cevabının aksine)
  • Sahip thisClassolan bir öğeyi ararken yanlış pozitif döndürmez class="thisClass-suffix".
  • en az IE6'ya kadar her tarayıcı ile uyumludur

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

28

Kullanılan sınıfları depolayan özniteliktir className.

Yani diyebilirsiniz:

if (document.body.className.match(/\bmyclass\b/)) {
    ....
}

JQuery her şeyi nasıl yaptığını gösteren bir konum istiyorsanız, ben tavsiye ederim:

http://code.jquery.com/jquery-1.5.js


1
Mükemmel. matchNitelik tekrar kullanışlı geliyor! Gerçekten jQuery JavaScript'te mümkün olandan daha fazlasını yapıyor mu ?! Değilse, jQuery sadece gereksiz bir steno ağırlığıdır.
animaacija

1
Bu aynı zamanda maçları myclass-somethinggibi \bmaçları tire.
Marc Durdin

1
@animaacija Tüm javascript kitaplıkları / eklentileri temel olarak javascript kısayoludur, çünkü javascript ile derlenmiştir. Şey: Stenolar her zaman gereklidir. Asla tekerleği yeniden icat etmeyin.
Edwin Stoteler

Bu harika bir çözüm!
Manuel Abascal

28

// 1. Use if for see that classes:

if (document.querySelector(".section-name").classList.contains("section-filter")) {
  alert("Grid section");
  // code...
}
<!--2. Add a class in the .html:-->

<div class="section-name section-filter">...</div>


4
@greg_diesel: cevaplardan vazgeçmeyin! Yaygın sorunlar için yeni çözümler memnuniyetle karşılanmaktadır.
raveren

2
@Raveren eski sorunlara yeni çözümler memnuniyetle karşılanırken, bu özel cevap yeni bir şey getirmiyor. Bu soruya sadece gürültü katıyor.
Emile Bergeron

1
@raveren Bu yeni bir çözüm değil, bu cevapla aynı ama daha az bilgiyle.
Monica'nın Davası

13

hasClass işlevi:

HTMLElement.prototype.hasClass = function(cls) {
    var i;
    var classes = this.className.split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] == cls) {
            return true;
        }
    }
    return false;
};

addClass işlevi:

HTMLElement.prototype.addClass = function(add) {
    if (!this.hasClass(add)){
        this.className = (this.className + " " + add).trim();
    }
};

removeClass işlevi:

HTMLElement.prototype.removeClass = function(remove) {
    var newClassName = "";
    var i;
    var classes = this.className.replace(/\s{2,}/g, ' ').split(" ");
    for(i = 0; i < classes.length; i++) {
        if(classes[i] !== remove) {
            newClassName += classes[i] + " ";
        }
    }
    this.className = newClassName.trim();
};

11

Basit / minimal bir çözüm, bir satır, çapraz tarayıcı kullanıyorum ve eski tarayıcılarla da çalışıyorum:

/\bmyClass/.test(document.body.className) // notice the \b command for whole word 'myClass'

Bu yöntem harika çünkü çoklu dolgu gerektirmez ve bunlarıclassList performans açısından çok daha iyidir. En azından benim için.

Güncelleme: Şu anda kullandığım çok yönlü bir çözüm olan küçük bir çoklu dolgu yaptım:

function hasClass(element,testClass){
  if ('classList' in element) { return element.classList.contains(testClass);
} else { return new Regexp(testClass).exec(element.className); } // this is better

//} else { return el.className.indexOf(testClass) != -1; } // this is faster but requires indexOf() polyfill
  return false;
}

Diğer sınıf manipülasyon için komple dosyasına bakın burada .


2
Bu bir sınıfın üzerinde gezecek notmyClassHeremi?
Teepeemm

2
Sınıf da orada değilse de sorabilirsiniz !/myClass/.test(document.body.className)fark !sembolü.
thednp

1
Soruyu reddetmekten bahsetmiyorum. Sınıf adı ise işlevinizin doğru şekilde geri dönmeyeceğini düşünüyorum thisIsmyClassHere.
Teepeemm

1
Ben sadece sorduğunuz şey olduğunu tahmin ediyordum, tam olarak neye ihtiyacınız olduğunu anlamadım, ama denediniz mi ve gerektiği gibi doğru / yanlış döndüremedi mi?
thednp

2
Bu, alt dizelerin kanıtı olmadığı için mükemmel değildir. Örneğin document.body.className = 'myClass123' olduğunda, /myClass/.test(document.body.className) true değerini döndürdüğünde ...
Zbigniew Wiadro

9

bunun için iyi bir çözüm classList ile çalışmak ve içerir.

ben böyle yaptım:

... for ( var i = 0; i < container.length; i++ ) {
        if ( container[i].classList.contains('half_width') ) { ...

Yani öğenize ihtiyacınız var ve sınıfların listesini kontrol edin. Sınıflardan biri aradığınız sınıfla aynıysa, değilse yanlış döndürür!


6

Şunun gibi bir şey kullanın:

Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');

3
Bu eşdeğer değil myHTMLSelector.classList.indexOf('the-class')mi? >=0Sonunda da istemiyor musun ?
Teepeemm

5
[].indexOfEğer classListbir containsyöntemi varsa kullanmanın anlamı nedir ?
Oriol

@Teepeemm no. myHTMLSelector.classList.indexOf('the-class')Bu hata verir myHTMLSelector.classList.indexOf is not a function, çünkü myHTMLSelector.classListbir dizi değil. Ama sanırım Array.prototypebazı dönüşümleri kullanarak çağırırken olur. Bu contains, çok iyi bir desteğe sahip olmasına rağmen eski tarayıcıyı destekleyebilir.
Ehsan88


2

Bu 'hasClass' işlevi IE8 +, FireFox ve Chrome'da çalışır:

hasClass = function(el, cls) {
    var regexp = new RegExp('(\\s|^)' + cls + '(\\s|$)'),
        target = (typeof el.className === 'undefined') ? window.event.srcElement : el;
    return target.className.match(regexp);
}

1

Yukarıdaki cevapların hepsi oldukça iyi ama işte uyandırdığım küçük basit bir fonksiyon. Oldukça iyi çalışıyor.

function hasClass(el, cn){
    var classes = el.classList;
    for(var j = 0; j < classes.length; j++){
        if(classes[j] == cn){
            return true;
        }
    }
}

3
classListBir containsyöntemi varsa yinelemenin anlamı nedir ?
Oriol

1

Bu yaklaşım hakkında ne düşünüyorsun?

<body class="thatClass anotherClass"> </body>

var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );

https://jsfiddle.net/5sv30bhe/


2
Değişken adlarınızı karıştırdığınızı düşünüyorum (active === myClass?). Fakat bu yaklaşım yanlış bir pozitiflik vermeyecek class="nothatClassIsnt"mi?
Teepeemm

0

İşte en basit yol:

var allElements = document.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) {
    if (allElements[i].hasAttribute("class")) {
         //console.log(allElements[i].className);
         if (allElements[i].className.includes("_the _class ")) { 
              console.log("I see the class");
         }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.