プレーンJavaScriptの「hasClass」関数とは何ですか?


313

hasClassプレーンなol 'JavaScriptでjQueryをどのように行うのですか?例えば、

<body class="foo thatClass bar">

JavaScript <body>が持っているthatClassかどうかを確認する方法は何ですか?


classプロパティを解析し(複数のクラスの場合、スペースで区切られたランダムな順序で複数のクラス名を持つ)、クラス名がその中にあるかどうかを確認する必要があると思います。それほど難しくはないが、学習目的ではないとしても、ひどく不便:)
Pekka

7
私がパーティーに遅刻するかどうかはわかりませんが、jQuery関数の代わりとなる優れたサイトはyoumightnotneedjquery.comです
ithil

回答:


116

element.className一致するかどうかを確認でき/\bthatClass\b/ます。
\b単語の区切りに一致します。

または、jQuery独自の実装を使用することもできます。

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

より一般的な質問に答えるには、githubのjQueryのソースコード、またはhasClassこのソースビューアーのソースを参照してください


6
jQuery実装の+1(検索したもの(これは適切な英語ですか?)のrclass実際の内容は;))
Felix Kling

6
\b「thatClass-anotherClass」と一致しませんか?
Matthew Crumley、2011

3
完全を期すために:最近のバージョンのrclassは "/ [\ n \ t \ r] / g"(\ r追加)
Felix Schwarz

4
@FelixSchwarzは正しい/[\t\r\n\f]/gです。現在のjQueryでは、正規表現がに更新されました。また/\bclass\b/-マイナス記号の付いたクラス名では失敗する可能性があることを言及するのは良いことです(それがうまく機能することを除けば)。これが、jQueryの実装の方が優れており、信頼性が高い理由です。たとえば/\bbig\b/.test('big-text')、期待されるfalseではなくtrueを返します。
スタノ2013年

996

単に使用classList.contains()

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

その他の用途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');

ブラウザサポート:

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

classList ブラウザのサポート


5
これはIE8ではサポートされていません。IE8は.classList文字列として取得できますが、次のようなより最近の方法は認識しません.classList.contains()
iono

7
@ionoでelement.classListがの MDNから実装記述IE8にこの動作をサポートを拡張シムありdeveloper.mozilla.org/en-US/docs/Web/API/Element/classList
ジェームズ

3
@AlexanderWigmoreに同意します。これは信じられないほど役に立ち、シンプルでした。
ジャックオリヴィエ

これに投票してください。これは、クラスをクエリするためのよりクリーンな方法です
user2190488

@SLaksこれは、承認済みの回答になるように更新する必要があります。
UmurKaragöz

35

その最も効果的なワンライナー

  • (オーブリングの答えとは対照的に)ブール値を返します
  • thisClassを含む要素を検索するときに、誤検知を返しませんclass="thisClass-suffix"
  • IE6以上のすべてのブラウザーと互換性があります

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

28

使用中のクラスを格納する属性はclassNameです。

だからあなたは言うことができます:

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

jQueryがすべてを行う方法を示す場所が必要な場合は、次のことをお勧めします。

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


1
優れた。match属性には便利再び来ます!本当にjQueryはJavaScriptで可能な以上のことをしますか?!そうでない場合、jQueryは単なる省略形の不要な重みです。
animaacija 2015年

1
ハイフンと一致するためmyclass-something、これもと\b一致します。
Marc Durdin、2015年

1
@animaacijaすべてのJavaScriptライブラリ/プラグインは、JavaScriptで構築されているため、基本的にJavaScriptの省略形です。ことです:常に省略形が必要です。ホイールを再発明しないでください。
Edwin Stoteler 2016

これは素晴らしいソリューションです!
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:答えを落とさないでください!一般的な問題の新しい解決策は大歓迎です。
raveren 2015年

2
@Raveren古い問題の新しい解決策は歓迎されますが、この特定の答えは何も新しいものをもたらしません。この質問にノイズを追加するだけです。
Emile Bergeron

1
@raverenこれは新しいソリューションではありません。この回答と同じですが、情報が少なくなっています。
モニカの訴訟に資金を提供

13

hasClass関数:

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関数:

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

removeClass関数:

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

私はシンプルで最小限のソリューション、1行のクロスブラウザーを使用しており、レガシーブラウザーでも動作します。

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

この方法は、ポリフィルを必要とせず、それらをclassListとパフォーマンスの点ではるかに優れています。少なくとも私にとっては。

更新:私が今使用しているオールラウンドなソリューションである小さなポリフィルを作りました:

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;
}

他のクラス操作については、こちらの完全なファイルを参照してください


2
このクラスのクラスを旅しnotmyClassHereますか?
Teepeemm

2
また、クラスが存在しないかどうかを尋ねたり!/myClass/.test(document.body.className)!記号に気づいたりすることもできます。
thednp '

1
質問を否定することについて話しているのではありません。クラス名がの場合、関数が誤ってtrueを返すと思いますthisIsmyClassHere
Teepeemm、2015年

1
私はそれがあなたが尋ねていることだと思っていましたが、あなたが必要なものを正確に理解していませんでしたが、試してみましたが、true / falseが返されませんでしたか?
thednp 10/4

2
これは部分文字列の証明ではないため、完全ではありません。たとえば、document.body.className = 'myClass123'の場合、/ myClass / .test(document.body.className)はtrueを返します...
Zbigniew Wiadro

9

これに対する良い解決策は、classListとcontainsを操作することです。

私はそれをこのようにしました:

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

したがって、要素が必要であり、クラスのリストを確認します。クラスの1つが検索したクラスと同じ場合は、trueを返します。そうでない場合は、falseを返します。


6

次のようなものを使用してください:

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

3
これは同等myHTMLSelector.classList.indexOf('the-class')ですか?>=0最後にもやりたくないですか?
Teepeemm

5
メソッドがある[].indexOf場合に使用する意味は何ですか?classListcontains
Oriol

@Teepeemmいいえ。myHTMLSelector.classList.indexOf('the-class')エラーを返すmyHTMLSelector.classList.indexOf is not a functionためにはmyHTMLSelector.classList、配列ではありませんが。しかし、私はそれをArray.prototypeいくつかの変換を使用して呼び出すときに起こると思います。これは古いブラウザをサポートするかもしれませんcontainsが、非常に良いサポートがあります。
Ehsan88


2

この「hasClass」関数は、IE8 +、FireFox、Chromeで機能します。

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

さて、上記の答えはすべてかなり良いですが、これは私が打ち上げた小さな単純な関数です。それはかなりうまくいきます。

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

3
メソッドclassListがある場合、反復のポイントは何containsですか?
Oriol

1

このアプローチについてどう思いますか?

<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
変数名を混ぜていると思います(active === myClass?)。しかし、このアプローチは偽陽性をclass="nothatClassIsnt"引き起こしませんか?
Teepeemm、2015年

0

最も簡単な方法は次のとおりです。

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");
         }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.