定義と使用方
querySelectorAll()
関数は、
HTMLドキュメントまたは特定の要素内で指定されたCSSセレクターに一致するすべての要素を返します。
基本の例
<ul>
<li>おにぎり</li>
<li>ラーメン</li>
<li>うどん</li>
</ul>
const liElements = document.querySelectorAll("li"); // liセレクターに一致するすべての要素を取得
console.log(liElements); // NodeList(3) [li, li, li]
// 配列に似た構造のため length プロパティを使用可能
let liElementsLength = liElements.length;
// ループ処理で要素にアクセス
for (let i = 0; i < liElementsLength; i++) {
console.log(liElements[i].textContent);
}
// 出力: "おにぎり" "ラーメン" "うどん"
コード補足説明length
プロパティは、文字列、配列、配列に似た構造の長さを返します。
コード補足説明for
ループは、特定の回数や範囲だけ繰り返し処理を行う文です。配列や配列に似た構造にも適用できます。
コード補足説明textContent
プロパティは、HTML要素のテキストコンテンツを取得または設定します。
構文
// HTMLドキュメント全体から
document.querySelectorAll(selectors)
// 特定の要素オブジェクト内から
element.querySelectorAll(selectors)
パラメーター
selectors |
文字列形式の有効なCSSセレクターです。 |
---|
戻り値
説明
querySelectorAll()
関数の実装方法と機能について説明します。
HTMLドキュメント全体で要素を検索
HTMLドキュメント(document
オブジェクト)全体で、すべての<p>
要素を検索するには、次の例のように記述できます。
let matches = document.querySelectorAll("p"); // HTMLドキュメントから要素を検索
特定の要素オブジェクト内で要素を検索
HTMLの特定の要素内で、すべての<p>
要素を検索するには、次の例のように記述できます。
<div class="container">
<p>子要素です。</p>
</div>
let container = document.querySelector(".container"); // 特定の要素オブジェクトです。
let matches = container.querySelectorAll("p"); // 特定の要素オブジェクト内で要素を検索
/* let matches = document.querySelectorAll(".container p"); と同じ戻り値です。 */
コード補足説明querySelector()
関数は、HTMLドキュメントまたは特定の要素内で指定されたCSSセレクターに一致する最初の要素オブジェクトを返します。
この例では、特定の親要素オブジェクト内でも使用できることを示しています。
ループ処理を通じて検索した要素を操作
CSSセレクターに一致するすべての要素をNodeList
オブジェクトのリストとして返します。
このリストは配列に似た構造を持っています。
このリスト内の要素は、ループ処理を通じて操作することができます。
次の例は、querySelectorAll()
関数でHTMLドキュメント内の<li>
要素を検索し、ループ処理を通じて特定の操作を行う例です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>querySelectorAll()関数</title>
</head>
<body>
<ul>
<li>おにぎり</li>
<li>ラーメン</li>
<li>うどん</li>
</ul>
<script src="queryselectorall.js"></script>
</body>
</html>
const liElements = document.querySelectorAll("li"); // liセレクターに一致するすべての要素を取得
console.log(liElements); // NodeList(3) [li, li, li]
/*
* このリストは配列に似た構造を持っています。
* このリスト内の要素は、ループ処理を通じて特定の操作を実行できます。
*/
/* 方法 1 - for...of 文を適用 */
for (const liElement of liElements) {
console.log(liElement.textContent);
}
// 出力: "おにぎり" "ラーメン" "うどん"
/* 方法 2 - for 文を適用 */
for (let i = 0; i < liElements.length; i++) { // length プロパティを使用可能
console.log(liElements[i].textContent);
}
// 出力: "おにぎり" "ラーメン" "うどん"
/* 方法 3 - forEach() 関数を適用 */
liElements.forEach(li => { // 配列に似ていますが forEach() 関数を適用可能
console.log(li.textContent);
});
// 出力: "おにぎり" "ラーメン" "うどん"
querySelectorAll()
関数が返すNodeList
オブジェクトは、配列に似た構造を持っています。NodeList
オブジェクトは、配列のようにインデックスを使用して要素にアクセスでき、length
プロパティで要素の数を確認できます。しかし、NodeList
オブジェクトは本物のJavaScript配列ではなく、配列に似た(iterable)オブジェクトです。
NodeList
オブジェクトは配列のように扱うことはできますが、本物の配列のように配列メソッド(push()
、pop()
など)を使用することはできません。
しかし、配列に似た構造であるにもかかわらず、配列をループ処理するときに使用するforEach()
関数は使用可能です。
状況別の例
状況別の例を通して、querySelectorAll()
関数の実装方法について見ていきます。
特定のクラス名を持つすべての要素にスタイルを適用する
<p class="highlight">これらの要素のスタイルを変更します。</p>
const highlightedElements = document.querySelectorAll(".highlight");
const elementsLength = highlightedElements.length;
for (let i = 0; i < elementsLength; i++) {
highlightedElements[i].style.backgroundColor = "yellow";
highlightedElements[i].style.color = "green";
}
この例では、クラス名が"highlight"
のすべての要素を選択し、これらの要素のスタイルを変更します。
特定の要素タイプに関する情報を出力する
<ul id="my-list">
<li>項目 1</li>
<li>項目 2</li>
<li>項目 3</li>
</ul>
const listItems = document.querySelectorAll("#my-list li");
const itemsLength = listItems.length;
for (let i = 0; i < itemsLength; i++) {
console.log("項目 " + (i + 1) + ": " + listItems[i].textContent);
}
この例では、id
が"my-list"
のリスト要素内のすべての<li>
要素を選択し、各要素のテキスト内容をコンソールに出力します。
リンクリストにイベントリスナーを追加する
<ul id="my-links">
<li><a href="#">リンク 1</a></li>
<li><a href="#">リンク 2</a></li>
</ul>
const linkList = document.querySelectorAll("#my-links a");
const linksLength = linkList.length;
for (let i = 0; i < linksLength; i++) {
linkList[i].addEventListener("click", function(event) {
event.preventDefault();
alert("リンクがクリックされました!");
});
}
この例では、id
が"my-links"
のリスト内のすべてのリンク(<a>
)要素を選択し、各リンクにクリックイベントリスナーを追加します。リンクをクリックすると、アラートメッセージが表示されます。
一致する要素が存在しない場合は、空のNodeList
オブジェクトを返します
<!DOCTYPE html>
<html lang="ja">
<head>
<title>querySelectorAll()の例</title>
</head>
<body>
<div id="myElement">この要素を選択できます。</div>
<script>
const nonExistentElement = document.querySelectorAll("#nonExistentElement");
if (nonExistentElement.length === 0) { // lengthプロパティでNodeListオブジェクトの長さにアクセス可能
console.log("一致する要素はありません。");
} else {
console.log("一致する要素が見つかりました。");
}
</script>
</body>
</html>
この例では、id
が"nonExistentElement"
に設定された要素は存在しないため、querySelectorAll()
で選択した#nonExistentElement
セレクターは一致する要素がなく、空のNodeList
を返します。その後、JavaScriptでif...else
文を使用して結果を確認し、コンソールにメッセージを出力します。結果は「一致する要素はありません。」となります。
DOMの変更をリアルタイム(または live)で反映しない
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>NodeList</title>
</head>
<body>
<ul id="list">
<li>おにぎり</li>
<li>ラーメン</li>
<li>うどん</li>
</ul>
<p><li> 要素の数: <strong id="li-length-val">3</strong></p>
<button type="button" id="addButton">新しいメニューを追加</button>
<script src="none-live.js"></script>
</body>
</html>
// <li>要素を取得
const liElements = document.querySelectorAll("li");
// ボタンクリック時に新しい<li>要素を追加
document.getElementById("addButton").addEventListener("click", () => {
const newLi = document.createElement("li");
newLi.textContent = '新しいメニュー';
// 新しい<li>要素を<ul>に追加
document.getElementById("list").appendChild(newLi);
// <li>要素の数をリアルタイムで確認
const liElementsLength = liElements.length; // すでに宣言したliElementsのlengthはリアルタイムでは反映されない
document.getElementById("li-length-val").textContent = liElementsLength;
});
コード補足説明getElementById()
関数は、HTMLドキュメント内で指定された文字列と一致するid属性を持つ要素オブジェクトを返します。
- おにぎり
- ラーメン
- うどん
<li>要素の数: 3
新しい要素を追加しても、querySelectorAll()
関数はリアルタイム(または live)で反映されないため、<li>
要素の数が変わらないことを確認できます。
仕様書
仕様書 | |
---|---|
querySelectorAll()
|
DOM Standard #ref-for-dom-parentnode-queryselectorall① |
ブラウザ互換性
関数 |
デスクトップ Chrome
|
デスクトップデスクトップ Edge
|
デスクトップ Firefox
|
Safari
|
---|---|---|---|---|
querySelectorAll()
|
1 | 12 | 3.5 | 3.1 |