【JavaScript】単一または複数クラスの存在(所持)確認または除外をする方法
更新日:2023/02/14
JavaScriptで、DOM要素が単一または複数の特定クラスを持っているかどうかを確認する方法を紹介します。
classList.contains()で存在確認
DOM要素に特定のクラスが存在するかどうかを確認するには、DOM要素.classList.contains()を使用します。
DOM要素.classList.contains()は、次の構文のようにクラス名を引数として受け付けます。
構文
DOM要素.classList.contains( クラス名 )
クラス名が存在するなら true を、存在しないなら false を返します。
HTML
<p class="class1 class2 class3">こんにちは</p>
<p>こんばんは</p>
JavaScript
const ptags = document.getElementsByTagName("p");
console.log( ptags[0].classList.contains("class2") ); // true
console.log( ptags[1].classList.contains("class2") ); // false
特定のクラスを持つ要素をすべて取得する
特定のクラスを持つ要素をすべて取得したい場合、次のようにdocument.getElementsByClassName()を使用します。
JavaScript
const elements = Array.from( document.getElementsByClassName("class2") );
elements.forEach( e=>console.log( e.innerText )); // こんにちは
Array.from()は、document.getElementsByClassName()で得たオブジェクトを配列(Arrayオブジェクト)に変換しています。
これにより、forEach()を使用できるようになります。
■取得済み要素リストから検索する場合
getElementsByTagName()等で、既に取得済みの要素リストから特定のクラスを持つ要素をリストアップするときは、classList.contains()を次のように使用します。
JavaScript
const class2Tags = Array.from( document.getElementsByTagName("p") )
.filter( e=>e.classList.contains("class2") );
class2Tags.forEach( e=>console.log( e.innerText )); // こんにちは
filter()はコールバック関数がtrueを返した要素で新しい配列を作成する関数です。
複数の特定クラスを持っているか確認する
複数の特定クラスを持っているか確認する場合は、確認したいクラス名の数だけclassList.contains()を呼び出します。
JavaScript
const ptag = document.getElementsByTagName("p")[0];
// "class1","class2","class3" を持っているかどうか確認
const result1 = ["class1","class2","class3"]
.every(e=>ptag.classList.contains(e) );
// "class1","class2","class4" を持っているかどうか確認
const result2 = ["class1","class2","class4"]
.every(e=>ptag.classList.contains(e) );
console.log( result1 ); // true
console.log( result2 ); // false
every()は全てのコールバック関数がtrueを返したとき、結果がtrueになります。
どれか一つでもfalseを返したら、結果はfalseです。
複数の特定クラスを持っている要素を全て取得する
複数の特定クラスを持っている要素を全て取得する場合、querySelectorAll()を使用します。
この関数はcssのセレクターと同じ形式で、取得したい要素を指定できます。
cssのセレクターで複数の特定クラスを指定するときは、クラス名を連結します。
JavaScript
const allTags = document.querySelectorAll(" p.class1.class2.class3 ");
Array.from(allTags).forEach( e=>console.log( e.innerText )); // こんにちは
■取得済み要素リストから検索する場合
既に取得済みの要素リストから特定のクラスを持つ要素をリストアップするときは、複数の特定クラスを持っているか確認するの方法を利用します。
JavaScript
const tags = Array.from( document.getElementsByTagName("p") )
.filter(
e=>["class1","class2","class3"]
.every( text => e.classList.contains(text) )
);
tags.forEach( e=>console.log( e.innerText )); // こんにちは
複数の特定クラスを持っている要素を除外する
今度は、複数の特定クラスを持っている要素を除外して、その他の要素を全て取得する方法です。
こちらもquerySelectorAll()を使用できます。
クラスを含まないという条件指定は、:not( .クラス名 ) を連結します。
JavaScript
// "class2","class3"を含まないpタグを取得
const tags = document.querySelectorAll( "p:not(.class2):not(.class3)");
Array.from(tags).forEach( e=>console.log( e.innerText )); // こんばんは
■取得済み要素リストから検索する場合
既に取得済みの要素リストから特定のクラスを持たない要素をリストアップするときは、複数の特定クラスを持っている要素を全て取得するの2つ目のコードを少し変更します。
JavaScript
const tags = Array.from( document.getElementsByTagName("p") )
.filter(
e=>!["class2","class3"]
.every( text => e.classList.contains(text) )
);
tags.forEach( e=>console.log( e.innerText )); // こんにちは
どこが変わったのか分かりにくいですが、filter()のコールバック関数に! (否定) を入れただけです。
更新日:2023/02/14
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。