jQueryで要素のクラスリストを取得する


657

jQueryで要素に割り当てられているすべてのクラスをループするか、配列に割り当てる方法はありますか?

例:

<div class="Lorem ipsum dolor_spec sit amet">Hello World!</div>

上記の「dolor_spec」のような「特別な」クラスを探します。hasClass()を使用できることはわかっていますが、実際のクラス名は必ずしもその時点でわかっているとは限りません。


その時点でクラス名がわからないためにhasClass()を使用できない場合、どのようにして配列内のどのクラスであるかを知るつもりですか?
doomspork '08 / 08/04

私は、jQueryを使用して予備検証を行うフォームを設計しています。エラーdivが生成された場合、入力要素のIDをエラーdivのクラスリストに追加しています。次に、エラーdivをクリックして、誤った入力要素にフォーカスできるようにします。このスクリプトは、複数のフォームで使用されます。したがって、スクリプト内でIDをハードコーディングしたくありません。
バガビル2009

1
ええ、なぜハードコーディングしたくないのか理解しました。しかし、少し時間を割いてredsquareの例を見れば、 'someClass'をifブロックにハードコーディングする必要があることがわかります。どちらの方法でも、変数を使用してこれを実現できます。
doomspork 08

class属性を使用する代わりに、名前空間内にエラーのある要素へのDOM参照を含むエラーリスト変数を含めることができます。したがって、毎回属性リストをプルし、それを反復して、DOM要素を見つけ、それにフォーカスする必要がなくなります。
doomspork 2009

回答:


732

document.getElementById('divId').className.split(/\s+/);クラス名の配列を取得するために使用できます。

次に、反復して、必要なものを見つけることができます。

var classList = document.getElementById('divId').className.split(/\s+/);
for (var i = 0; i < classList.length; i++) {
    if (classList[i] === 'someClass') {
        //do something
    }
}

jQueryは実際にはここでは役に立ちません...

var classList = $('#divId').attr('class').split(/\s+/);
$.each(classList, function(index, item) {
    if (item === 'someClass') {
        //do something
    }
});

4
これはまさに私が大したことですが、クラスのコレクションを提供するjQuery関数のビルドがあるかどうかはわかりませんでした。
サンダー

36
FYI:jQueryのはclassName.splitを(/ \ sの+ /)を使用しています
ケンプͩ

70
自分でプラグインのjQueryを追加します$.fn.classList = function() {return this[0].className.split(/\s+/);};
ripper234

1
または、あなた可能性: if ($.inArray("someclass",classList)>=0) { /* hasClass someclass*/ }
sambomartin

ここではJavaScriptの専門家ではありません。split(/ \ s + /)が単にsplit( "")を行うよりも優れているかどうか教えていただけますか?FF23 / Chrome28 / IE8でも同じように機能します。
Roberto Linares 2013

288

なぜ誰も単純にリストしていません。

$(element).attr("class").split(/\s+/);

編集:@MarkAmeryが指摘しているように、.split(' ')クラス名をあらゆる種類の空白で区切ることができるからといって、それを行うことはできません。


6
それは受け入れられる回答の一部です...要素に適用されるすべてのクラスが必要でした。
Buggabill 2012

54
間違っているから!クラスは任意の種類の空白で区切ることができます(たとえば、HTMLの長いクラス属性を複数行にラップできます)が、この回答はそれを説明できません。$('<div class="foo bar baz">').attr("class").split(' ')ブラウザコンソールに貼り付けてみてください(そこにタブ文字があります)。["foo", "bar baz"]の正しいクラスリストの代わりに取得します["foo", "bar", "baz"]
Mark Amery

2
@MarkAmeryは正しいです。がある場合は、class="foo <lots of spaces here> bar"空の文字列要素を持つ配列になります。
Jacob van Lingen

4
99%の場合、このソリューションは効果的だと思います。つまり、HTMLを制御している場合です。HTML標準でこれが許可されている場合でも、クラス名の間にタブまたは複数のスペースの可能性をサポートする必要がある理由は考えられません。
Gordon Rouse

5
@GordonRouseクラスのリストに忍び寄る余分なスペースは、特にある種のロジックがクラスのリストを書き出している場合は特に一般的です。
エリック

142

サポートするブラウザでは、DOM要素のclassListプロパティを使用できます。

$(element)[0].classList

これは、要素が持つすべてのクラスをリストする配列のようなオブジェクトです。

classListプロパティをサポートしていない古いバージョンのブラウザーをサポートする必要がある場合、リンクされたMDNページにもそのシムが含まれます。ただし、シムでさえIE 8より前のInternet Explorerバージョンでは機能しません。


クリーンな答えであり、ホイールを再発明しません。
Marco Sulla 2016年

@Marco Sulla:これは確かに古いソフトウェアのサポート以外の欠点があります。 .classListは真の配列ではあり.indexOf(⋯)ません。そのようなメソッドは機能しません。これは「配列のようなオブジェクト」にすぎませんが、.className.split(/\s+/).indexOf(⋯)(受け入れられた回答から)機能します。
Incnis Mrsi

iterableをArrayusing [...iterable]またはArray.from(iterable)
Marco Sulla

142

これは、一致した要素が持つすべてのクラスの配列を返すjQueryプラグインです

;!(function ($) {
    $.fn.classes = function (callback) {
        var classes = [];
        $.each(this, function (i, v) {
            var splitClassName = v.className.split(/\s+/);
            for (var j = 0; j < splitClassName.length; j++) {
                var className = splitClassName[j];
                if (-1 === classes.indexOf(className)) {
                    classes.push(className);
                }
            }
        });
        if ('function' === typeof callback) {
            for (var i in classes) {
                callback(classes[i]);
            }
        }
        return classes;
    };
})(jQuery);

好きに使う

$('div').classes();

あなたの場合には戻ります

["Lorem", "ipsum", "dolor_spec", "sit", "amet"]

各クラスで呼び出されるメソッドに関数を渡すこともできます

$('div').classes(
    function(c) {
        // do something with each class
    }
);

これは、http: //jsfiddle.net/GD8Qn/8/をデモンストレーションおよびテストするために設定したjsFiddleです。

縮小Javascript

;!function(e){e.fn.classes=function(t){var n=[];e.each(this,function(e,t){var r=t.className.split(/\s+/);for(var i in r){var s=r[i];if(-1===n.indexOf(s)){n.push(s)}}});if("function"===typeof t){for(var r in n){t(n[r])}}return n}}(jQuery);

パーフェクトに適合FullCalendarにクラスをコピーするときは、classNameイベントの属性。
Dan Power

78

あなたはこれを試すべきです:

$("selector").prop("classList")

要素の現在のすべてのクラスの配列を返します。


これは受け入れられた答えよりもすっきりしていますが、この方法を使用しない理由はありますか?
RozzA 2016年

5
よくわかりません。しかし、これはDOM要素からプロパティを取得する適切な方法です。また、「classList」は、要素に適用されるcssクラスの配列を提供するプロパティです。
P.Petkov 2016年

@RozzA多分それは当時利用できなかったのでしょうか?しかし、私はあなたが単純なjQueryの、使用しない場合を除き、これは、今のように、最も適切な方法であると言うだろう.classListあなただけの不一致および/または欠落しているブラウザのサポートに注意を払うに必要... -ソリューションです
Dennis98

@ Dennis98よろしくお願いします。最近、どれほど急速に新しい機能が登場したかを忘れています。.classListまた、最新のブラウザーで非常にうまく機能するプレーンなjsを実行しました
RozzA

1
このclassListプロパティは、SVG要素のIE 10/11では機能しません(HTML要素では機能します)。参照developer.mozilla.org/en-US/docs/Web/API/Element/classList
Métoule

17
var classList = $(element).attr('class').split(/\s+/);
$(classList).each(function(index){

     //do something

});

7

更新:

@Ryan Leonardが正しく指摘したように、私の答えは私が自分で作ったポイントを実際には修正しません...(たとえば)string.replace(/ + / g、 "")でダブルスペースをトリミングして削除する必要があります..または、el.classNameを分割し、(たとえば)arr.filter(Boolean)を使用して空の値を削除することもできます。

const classes = element.className.split(' ').filter(Boolean);

またはより現代的な

const classes = element.classList;

古い:

与えられたすべての答えで、ユーザー.trim()(または$ .trim())を忘れないでください

クラスは追加および削除されるため、クラス文字列の間に複数のスペースがある場合があります。例: 'class1 class2 class3' ..

これは['class1'、 'class2'、 ''、 ''、 ''、 'class3']に変わります。

トリムを使用すると、複数のスペースがすべて削除されます。


2
これは不正解です(回答ではありません)。String.trim()と$ .trim()はどちらも、先頭と末尾の空白をすべて削除し、残りの文字列はそのままにします。 ?jsconsole.com /%22%20%20A%20%20B%20%20%22.trim()
ライアン・レナード

あなたも答えを見ましたか?それは、クラスを読み込む際に、アレイ内の空のクラスが存在することになるように、すべてのネイティブJSソリューションは、このように障害のあるクラスのリストを与え、空白を先頭と末尾をチェックしませんでした... jQueryのは、トリムで内部的に同じことを
DutchKevv

2
私は他の答えを見ました、そしてクラス名の間の空白が削除されるべきであることに同意します。私はそれを完全な答えではないので、a)これは他のソリューションに関するコメントであるべきだと指摘していましたb).trim()は必要なことを達成するために複数のスペースを削除しませ
Ryan Leonard

1
あなたは確かに完全に正しいです...私のクイックコメントでごめんなさい..それはその間のスペースを削除しません... s.trim()。replace(/ + / g、 "")または何かが必要になるでしょうその隣に...クラス間のすべての複数のスペースを削除するには、el.classListはほとんど広く、すべての私は...と仮定し、それを固定し、サポートされています
DutchKevv

1
全く問題なし。幸いにも賛成票を投じた、.classListよりクリーンなアプローチです!
Ryan Leonard

7
$('div').attr('class').split(' ').each(function(cls){ console.log(cls);})

2
これは恐ろしい虐待です.map。の戻り値.eachが必要ない場合に使用し.mapます。空白も壊れているのではなく、スペース上の分割は-の私のコメントを参照stackoverflow.com/a/10159062/1709587を。これらの点のいずれも真実でなかったとしても、これはページに新しいものを追加しません。-1!
Mark Amery 2014

3

これも役立つかもしれません。この関数を使用して、子要素のクラスを取得しました。

function getClickClicked(){
    var clickedElement=null;
    var classes = null;<--- this is array
    ELEMENT.on("click",function(e){//<-- where element can div,p span, or any id also a class
        clickedElement = $(e.target);
        classes = clickedElement.attr("class").split(" ");
        for(var i = 0; i<classes.length;i++){
            console.log(classes[i]);
        }
        e.preventDefault();
    });
}

あなたの場合、あなたはdoler_ipsumクラスが欲しいのですがuは今このようにすることができますcalsses[2];


2

これをありがとう-私は同様の問題を抱えていました。プログラムでオブジェクトを階層的なクラス名に関連付けようとしているためです。ただし、それらの名前は必ずしもスクリプトで認識されているとは限りません。

スクリプトでは<a><a>タグ[some_class]にのクラスとのクラスをtoggle与え、ヘルプテキストにのクラスを与えることで、タグがヘルプテキストをオン/オフにしたいと思っています[some_class]_toggle。このコードは、jQueryを使用して関連要素を正常に検索しています。

$("a.toggle").toggle(function(){toggleHelp($(this), false);}, function(){toggleHelp($(this), true);});

function toggleHelp(obj, mode){
    var classList = obj.attr('class').split(/\s+/);
    $.each( classList, function(index, item){
    if (item.indexOf("_toggle") > 0) {
       var targetClass = "." + item.replace("_toggle", "");
       if(mode===false){$(targetClass).removeClass("off");}
       else{$(targetClass).addClass("off");}
    }
    });
} 

おかげで、私は同じようなことをやっています、これを行う簡単な方法がないことに驚きます。
Eric Kigathi、2012年

-1-tl; dr、質問に直接関連しない接線でオフになります。
Mark Amery 2014

2

これを試して。これにより、ドキュメントのすべての要素からすべてのクラスの名前が取得されます。

$(document).ready(function() {
var currentHtml="";
$('*').each(function() {
    if ($(this).hasClass('') === false) {
        var class_name = $(this).attr('class');
        if (class_name.match(/\s/g)){
            var newClasses= class_name.split(' ');
            for (var i = 0; i <= newClasses.length - 1; i++) {
                if (currentHtml.indexOf(newClasses[i]) <0) {
                    currentHtml += "."+newClasses[i]+"<br>{<br><br>}<br>"
                }
            }
        }
        else
        {
            if (currentHtml.indexOf(class_name) <0) {
                currentHtml += "."+class_name+"<br>{<br><br>}<br>"
            }
        }
    }
    else
    {
        console.log("none");
    }
});
$("#Test").html(currentHtml);

});

これが実際の例です:https : //jsfiddle.net/raju_sumit/2xu1ujoy/3/


1

画像タイプの要素についても、同様の問題がありました。要素が特定のクラスかどうかを確認する必要がありました。最初に私が試した:

$('<img>').hasClass("nameOfMyClass"); 

しかし、「この機能はこの要素では利用できません」という素晴らしい情報を得ました。

次に、DOMエクスプローラーで自分の要素を調べたところ、使用できる非常に優れた属性であるclassNameが見つかりました。空白で区切られた私の要素のすべてのクラスの名前が含まれていました。

$('img').className // it contains "class1 class2 class3"

これを取得したら、通常どおりに文字列を分割します。

私の場合、これはうまくいきました:

var listOfClassesOfMyElement= $('img').className.split(" ");

これは他の種類の要素(img以外)でも機能すると想定しています。

それが役に立てば幸い。


0

javascriptは、domのノード要素にclassList属性を提供します。単に使用する

  element.classList

フォームのオブジェクトを返します

  DOMTokenList {0: "class1", 1: "class2", 2: "class3", length: 3, item: function, contains: function, add: function, remove: function…}

オブジェクトには、contains、add、removeなどの関数があり、使用できます


3年前に投稿されたstackoverflow.com/a/5457148/1709587の劣った複製。-1。
Mark Amery 2014

-3

少し遅れますが、extend()関数を使用すると、任意の要素で "hasClass()"を呼び出すことができます。例:
var hasClass = $('#divId').hasClass('someClass');

(function($) {
$.extend({
    hasClass: new function(className) {
        var classAttr = $J(this).attr('class');
        if (classAttr != null && classAttr != undefined) {
            var classList = classAttr.split(/\s+/);
            for(var ix = 0, len = classList.length;ix < len;ix++) {
                if (className === classList[ix]) {
                    return true;
                }
            }
        }
        return false;
    }
}); })(jQuery);

10
それは問題ではありませんでした。
トーマス

5
また、jQueryにはバージョン1.2以降、この関数が組み込まれています。
Andrew

-3

問題は、Jqueryが何をするように設計されているかです。

$('.dolor_spec').each(function(){ //do stuff

そして、なぜ誰も.find()を答えにしないのですか?

$('div').find('.dolor_spec').each(function(){
  ..
});

IE以外のブラウザのclassListもあります。

if element.classList.contains("dolor_spec") {  //do stuff

3
-1; 他の問題の中でも、最初の2つのコードスニペットは、尋ねられた質問とは無関係であり、最後のスニペットは構文エラーです。
マークアメリー2014

-4

これで、すべてのクラスの配列を返すようにreadquareの答えを調整しました。

function classList(elem){
   var classList = elem.attr('class').split(/\s+/);
    var classes = new Array(classList.length);
    $.each( classList, function(index, item){
        classes[index] = item;
    });

    return classes;
}

サンプルの呼び出しが次のようになるように、jQuery要素を関数に渡します。

var myClasses = classList($('#myElement'));

3
なぜclassList配列を反復処理し、すべての要素をclasses配列に追加して、classes配列を返すのですか?classListを返すだけでも同じトリックを実行する必要がありますよね?
Martijn、2012

いいえ。同じ要素に多くのクラスがある状況について言及しているので。とても簡単だったら、私たちはこのスレッドにいなかった:)
Gregra '29

8
このスレッドはクラスのリストを返すことに関するものであり、単に返す$(elem).attr('class').split(/\s+/)ことでそれを行います。多分私は誤解しているかもしれませんが、コレクションを反復処理し、コンテンツを新しいコレクションにコピーして、その新しいコレクションを返す理由は何もありません。
Martijn 2012

-4

これは古い質問ですが、それでもわかります。

<div id="specId" class="Lorem ipsum dolor_spec sit amet">Hello World!</div>

var className=".dolor_spec" //dynamic

要素を操作したい場合

$("#specId"+className).addClass('whatever');

要素にクラスがあるかどうかを確認したい場合

 $("#specId"+className).length>0

複数のクラスの場合

//if you want to select ONE of the classes
var classNames = ['.dolor_spec','.test','.test2']
$("#specId"+classNames).addClass('whatever');
$("#specId"+classNames).length>0
//if you want to select all of the classes
var result = {className: ""};
classNames.forEach(function(el){this.className+=el;},result);
var searchedElement= $("#specId"+result.className);
searchedElement.addClass('whatever');
searchedElement.length>0

1
これらのスニペットはいずれも、尋ねられた質問にまったく対応していません。-1。
マークアメリー2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.