要素にJavaScriptのクラスが含まれているかどうかを確認しますか?


588

(jQueryではなく)プレーンなJavaScriptを使用して、要素クラスが含まれているかどうかを確認する方法はありますか?

現在、私はこれをやっています:

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>

問題は、HTMLをこれに変更すると...

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

...完全に一致するものではなくなったため、デフォルトの出力であるナッシング("")が表示されます。しかし、私はまだ出力になりたいI have class1ので<div>、まだ含まれている.class1クラスを。


5
element.classList.contains(cls)
Ronnie Royston、

回答:


1039

使用方法:element.classList .contains

element.classList.contains(class);

これは現在のすべてのブラウザーで機能し、古いブラウザーをサポートするためのポリフィルもあります。


または、古いブラウザを使用していて、ポリフィルを使用して修正したくない場合indexOfは、使用は適切ですが、少し微調整する必要があります。

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

それ以外の場合trueは、探しているクラスが別のクラス名の一部である場合にも取得されます。

デモ

jQueryは同様の(同じではないにしても)メソッドを使用します。


例に適用:

これはswitchステートメントと一緒に機能しないため、次のコードで同じ効果を得ることができます。

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

また、冗長性も低くなります;)


すばらしいですが、divに含まれるクラスに基づいて出力を変更できるように、switchステートメントと組み合わせて使用​​するにはどうすればよいですか?
daGUY、2011

@daGUY:とにかく、switchステートメントで何をしたいですか?たとえば、2番目のdivクラスには2つのクラスがありI have class1ますが、使用しているときにのみ出力されますbreak。要素が持つすべてのクラスを出力したい場合は、を取得してclassName、空白で分割することができます。またはあなたの実際の目標は何ですか?
Felix Kling、

@Felix Kling:divのinnerHTMLに、含まれるクラスに応じて4つの異なる文字列を切り替える必要があります。「I have class1」などを例として使用しました-実際の文字列はすべて異なります。私は一度に1つの文字列のみを表示し、組み合わせはしません(そのため、各ケースの後に改行します)。一致するクラスがdivの複数のクラスの1つである場合でも、それが機能することを望みます。
daGUY、2011

@フェリックスクリング:それはそれをやった、どうもありがとう!実際にはクラスの名前を出力しているのではなく、4つの完全に異なる文字列の1つを出力しているので、それぞれを処理するためにいくつかのIF / ELSE IFステートメントで少し変更しました。でも完璧に動作します。
daGUY、2011

1
前後にスペースを入れた理由はありますか?
2016

93

簡単で効果的な解決策は、.containsメソッドを試すことです。

test.classList.contains(testClass);

3
プロパティのcontainsメソッドelement.classList
user907860

7
NB!すべてのブラウザでサポートされているわけではありません。詳細はこちら:caniuse.com/#feat=classlist
Silver Ringvee

4
これは素晴らしい答えであり、今では.contains()がより幅広いサポートを持っていると私は信じています。
Nicholas Kreidberg 2017年

49

最新のブラウザでは、次のcontains方法を使用できますElement.classList

testElement.classList.contains(className)

デモ

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>


サポートされているブラウザ

ここに画像の説明を入力してください

CanIUse.comから)


ポリフィル

使用しElement.classListたいが古いブラウザーもサポートしたい場合は、Eli Grayによるこのポリフィルの使用を検討してください


10

彼がswitch()を使用したいので、誰もこれをまだ出していないことに驚きます:

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

1
私は同じことを考えていただけですが、はい、それは元の問題に最も近いものです!
シルバーリングビー2016年

8

Element.matches()

element.matches(selectorString)

MDN Web Docsによると:

このElement.matches()メソッドはtrue、指定されたセレクター文字列によって要素が選択されるかどうかを返します。それ以外の場合はを返しますfalse

したがって、を使用Element.matches()して、要素にクラスが含まれているかどうかを判断できます。

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

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

ブラウザの互換性を表示


7

jQueryを使用せずに要素にクラスが含まれていることを確認しようとしている場合の小さな抜粋を次に示します。

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

これは、要素にスペースで区切られた複数のクラス名が含まれる可能性があるという事実を説明しています。

または


この関数を要素プロトタイプに割り当てることもできます。

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

そして、次のようにトリガーします(jQueryの.hasClass()関数に非常に似ています)。

document.getElementById('MyDiv').hasClass('active');

私はこの解決策を好む。クラス名が別のクラスと部分的に一致する問題を回避し、IEで機能するためにポリフィルを必要としません。
scoota269 2017

5

シンプルなワンライナー:1

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

indexOf配列の 1はIE(もちろん)でサポートされていません。そのためにたくさんのサルのパッチがネット上で見つかります。


1
単語境界の問題は、などのクラス名に有効な文字が-単語境界と見なされることです。例えば探してfoo、クラスはfoo-baryields trueです。
Felix Kling、

あなたが正しいです。オリジナルを削除し、別のアプローチを追加しました。まだワンライナー。
KooiInc

5

これは少し古いですが、誰かが私の解決策を役立つと思うかもしれません:

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

使用: 'element.hasClass(' classname ');
認知症

なぜt.length >>> 0を使用したのですか?私の知る限りでは、「0」を使用しても何も起こりません。
Vitor Canova 2013

単純なもののためのコードがすごい。正規表現を使用して、ホイールを再発明しないのはなぜですか?あなただけ/^class_name_you_are_searching_for$/.test(myElement.className)を使用することができます
pqsk

1
速すぎて書いた。正規表現が複雑すぎないようにするために、
\ s * class_name_you_are_searching_for \ s * /。test(myElement.className)– pqsk

@pqsk-将来使用するために自分のライブラリを作成します。これは私のスタックに追加されます。もちろん、他の解決策も機能しますが、これはちょうど私の好まれる方法です
認知症

4

classNameは単なる文字列なので、通常のindexOf関数を使用して、クラスのリストに別の文字列が含まれているかどうかを確認できます。


1
class上記の例のクラスのテストについてはどうですか?
Felix Kling、

6
経験上、このメソッドは非常に危険な場合があります。クラスfooを含む要素でクラスを探すと、trueが返されますfoobar
Zirak、

2
もちろん、テストしているものを知っているだけです。Felixのコードは、スペースを区切り文字として使用するとうまく機能します。
David

クラス名のネストされたインスタンスを説明できません。例:「end」はクラス名「frontend」にあります。
Anthony Rutledge 2016年

4

私はたくさんの答えを知っていますが、それらのほとんどは追加の関数と追加のクラスのためのものです。これは私が個人的に使用するものです。はるかにクリーンではるかに少ないコード行!

if( document.body.className.match('category-page') ) { 
  console.log('yes');
}

1
部分的に一致するクラス名を検索すると、このメソッドは誤検出を返す可能性があります(例:<body class="category-page">document.body.className.match('page')-は一致しますがpage、要素に関連付けられたクラスがない場合)
hooblei

正規表現であるため\b、たとえば/\bpage\b/gで解決できます(注:を使用する必要があります/ /g)。
Andrew

2

大文字と小文字を区別しない簡単な解決策を次に示します。

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

2

要素にクラス名が1つしかない場合は、class属性を取得することですばやく確認できます。他の答えははるかに堅牢ですが、これには確かにユースケースがあります。

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

}

2

classList可能な場合はを使用するプロトタイプメソッドを作成しました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>

テストページ


e.classNameのインデックスの代わりにクラスリストを使用する理由はありますか?パフォーマンスはそれほど良くないようです
Ced

@Ced-まあ、クラスの何千もの要素をテストしないのであれば、perfは関係ありません(おそらくブラウザでリファクタリングされるでしょう)。コードはその機能を説明しているため使用する方がエレガントですが、
最終的に

1
  1. スペースを追加してclassNameと検索する文字列を隣接させるFelixのトリックは、要素にクラスがあるかどうかを判断するための適切なアプローチです。

  2. クラスに応じて異なる動作をさせるには、マップ内で関数参照または関数を使用できます。

    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)は、fnsマップ内のキーを反復処理します。
    • fnsiの後にブレークがないと、一致がある場合はいつでもコードを実行できます。つまり、要素にfi、class1、class2がある場合、fn1とfn2の両方が実行されます。
    • このアプローチの利点は、switchステートメントのコードのように、各クラスに対して実行するコードが任意であることです。あなたの例ではすべてのケースが同様の操作を実行しましたが、明日はそれぞれに異なることをする必要があるかもしれません。
    • ループで一致が見つかったかどうかを通知するステータス変数を使用して、デフォルトのケースをシミュレートできます。


1

これは少しずれていますが、切り替えをトリガーするイベントがある場合は、クラスなしで実行できます。

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

できるよ

$('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, '')から数字を削除しますid

少しハックですが、余分な機能やループのない長いスイッチで機能します


1

バニラJavaScript〜を使用して特定のクラスがあるかどうか要素をチェックするより速くて簡単な方法については、このCodepenリンクを参照してください!

hasClass(バニラJS)

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

1

これはIE8 +でサポートされています。

まず、IE10 +でサポートされてclassListいるcontainsメソッドを使用できるかどうかを確認します。IE9またはIE 8を使用している場合は、正規表現の使用にフォールバックします。これは効率的ではありませんが、簡潔なポリフィルです。

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

あるいは、babelでコンパイルしている場合は、次のように使用できます。 el.classList.contains(className);


0

これを試してください:

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

1
単語の境界に注意してください。また、たとえばクラスがfoo-barあり、を検索した場合にもtrueに一致しますfoo
Felix Kling、

1
こんにちはジミー、私はこの\ bメタ文字を検索していて、[ a-zA-Z0-9_] のみを単語文字と見なします。したがって、マイナス文字を含むクラス名の場合、これは機能しません
Stano 2013年

0

完璧な解決策はこれだと思います

if ($(this).hasClass("your_Class")) 
    alert("positive");            
else              
    alert("Negative");

8
1.「jQueryではなくプレーンなJavaScriptを使用する」2.ブラケットを使用する
nkmol

3-括弧を使用
TheBlackBenzKid 2017

0

現在、どの要素がクラス「.bar」ですか?ここに別のソリューションがありますが、それはあなた次第です。

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

jsfiddleデモ

もちろん、これは1つの単純な要素<img>/Image/g)のルックアップにすぎません<li>/LI/g、is 、<ul>= /UL/gなどのようにすべてを配列に入れることができます。


0

インラインSVG要素内でクラス名を見つけようとする人々の答えに追加するだけです。

hasCLass()関数を次のように変更します。

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

classNameプロパティを使用する代わりに、getAttribute()メソッドを使用してクラス名を取得する必要があります。


0

私は自分のウェブサイト用にこれらの関数を作成しました。私はバニラのJavaScriptのみを使用しています。多分それは誰かを助けるでしょう。まず、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;
    }

次に、削除するクラスと要素のセレクターを受け取る関数:

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

これで、次のように使用できます。

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

それがお役に立てば幸いです。


0

ヒント:プロジェクトのjQueryの依存関係をできるだけ削除するようにしてください-VanillaJS

document.firstElementChild<html>タグを返し、classList属性はそれに追加されたすべてのクラスを返します。

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

-1

私にとってそれを達成する最もエレガントで速い方法は:

function hasClass(el,cl){
   return !!el.className && !!el.className.match(new RegExp('\\b('+cl+')\\b'));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.