JavaScript セレクター関数 querySelector および querySelectorAll

JavaScript セレクター関数 querySelector および querySelectorAll

セレクターはCssの非常に強力な機能です。以前は、ページ要素は一般的にgetElementByIdgetElementsByTagNameを通じて取得されていましたが、これはいくつかのシナリオでは非常に不便でした。

その後、DOM はSelector API標準を拡張し、 Selector API Level 1には、CSS セレクターを通じてページ要素を一致させることができるquerySelectorquerySelectorAllという 2 つのメソッドが含まれるようになりました。

1. querySelectorは単一の要素を照会する

querySelectorは、ルールを満たすページ内の最初の要素を照会するために使用されます。これは、セレクター文字列パラメータを受け取り、 DocumentインスタンスおよびElementインスタンスで呼び出すことができます。見つかった場合はHTMLElementオブジェクトを返し、見つからない場合はnullを返します。

構文の形式は次のとおりです。

ドキュメントインスタンス.querySelector(セレクター文字列);

要素インスタンス.querySelector(セレクター文字列);

1. ドキュメントインスタンスの呼び出し

Documentインスタンス呼び出しは、ページ全体の一致する要素を取得します。

簡単な例は次のとおりです。

// body 要素を取得します。let body = document.querySelector("body");

コンソール.log(本文)

// ID が container の要素を取得します。最初の要素のみが取得されます。let container = document.querySelector("#container");

console.log(コンテナ)

// クラス内の btn を含む要素を取得します。最初の要素のみが取得されます。let btn = document.querySelector(".btn");

コンソールにログ出力します。



// コンテナーの直接のサブクラスで btn を含む要素を取得します。最初の要素のみが取得されます。let containerBtn = document.querySelector("#container>.btn");

コンソールにログ出力します。

2. 要素インスタンスの呼び出し

Elementインスタンス呼び出しは、要素のサブツリー内の一致する要素を取得します。

簡単な例:

// ID が container の要素を取得します。let container = document.querySelector("#container");

// 要素オブジェクトが存在するかどうかを確認する必要があります。存在する場合のみ、querySelector メソッドがあります。if (container) {

	// コンテナー内でクラスに btn が含まれる要素のみを検索します。

	containerBtn = container.querySelector(".btn"); とします。

	コンソールにログ出力します。

}

理論的には、CSS はセレクターを通じてページ上の任意の要素を取得できるため、 Elementインスタンス呼び出しはDocumentインスタンス呼び出しメソッドとして直接記述でき、セレクター文字列パラメータを変更するだけで済みます。

たとえば、上記の例は次のように直接記述できます。

containerBtn = document.querySelector("#container .btn"); とします。

また、if 判断が 1 つ減ったため、コードはより簡潔になります。もちろん、ビジネス シナリオによっては、 ELementインスタンスがすでに決定されているため、 ELementインスタンスを使用して直接呼び出す方が便利です。

2. querySelectorAllはすべての要素を照会します

querySelectorAllメソッドはquerySelectorメソッドと似ていますが、 NodeList内のすべての一致する要素を返す点が異なります。

簡単な例:

// ページに記事を含む2つのdivクラスがあると仮定します

// クラスに article が含まれるすべての要素を取得します。let articleList = document.querySelectorAll(".article");

console.log(記事リスト);

console.log(記事リストの長さ);

// コンソール出力:

// ノードリスト(2) [div.article, div.article]

// 2

querySelectorAllメソッドはすべての要素を返します。実際には、トラバーサルが必要になることがよくあります。トラバーサルは、従来のforトラバーサル、 for ofトラバーサル、およびforEachトラバーサルを使用して実行できます。

// トラバーサルの for (let item of articleList) {

	console.log(アイテム);

}

// トラバーサル用 for (let i = 0; i < articleList.length; i++) {

	console.log(記事リスト[i]);

	console.log(記事リスト.item(i));

}

// forEach は articleList.forEach((item, index) => { を走査します

	console.log(アイテム、インデックス);

});

1. for in トラバーサルの問題

for or inトラバーサルが使用される場合、 entriesforEachなど、プロトタイプ チェーン上の一部のメソッドもトラバースされます。

2. リアルタイムではなくスナップショットの問題

querySelectorAllメソッドを使用して取得されるNodeListスナップショットであり、リアルタイム データではありません。

次の例を考えてみましょう。

// 取得するには querySelectorAll を使用します。articleList は静的であり、リアルタイムではありません。let articleList = document.querySelectorAll(".article");

console.log(記事リスト);

console.log(記事リスト.長さ); // 2

タイムアウトを設定する(() => {

	// 要素を追加します let div = document.createElement("div");

	div.className = "記事";

	ドキュメントのbodyに子要素を追加します。	

	console.log(記事リスト);

	// まだ2

	console.log(記事リストの長さ);

}, 0);

最後に、タイマーが設定され、 class articleを持つdiv要素がページに挿入されますが、 articleListの長さは依然として 2 のままです。

getElementsByClassNameを使用して取得する場合、 articleListリアルタイム データになります。

次の例を考えてみましょう。

//getElementsByClassName を使用して取得します。articleList はリアルタイムです。let articleList = document.getElementsByClassName("article");

console.log(記事リスト);

console.log(記事リストの長さ);



タイムアウトを設定する(() => {

	// 要素を追加します let div = document.createElement("div");

	div.className = "記事";

	ドキュメントのbodyに子要素を追加します。

	

	console.log(記事リスト);

	// ここは3

	console.log(記事リストの長さ);

}, 0);

コンソールで印刷結果を表示します。

HTMLCollection の動的効果:

getElementsByClassNameを使用して取得されるオブジェクトはHTMLCollection型であり、ドキュメント フローに応じて変化します。

3. まとめ

  • 1. querySelectorquerySelectorAll CSS セレクターに従ってページ要素を取得します。これは非常に強力です。
  • 2. querySelectorAll取得される要素はスナップショットであり、静的であり、リアルタイムではありません。落とし穴に注意してください。

JavaScriptセレクター関数querySelectorquerySelectorAll JavaScript querySelectorと querySelectorAll の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JS 災害と CSS 災害から遠ざかる: JS プライベート関数とコンテナとしての CSS セレクタ
  • js は円形メニューセレクターを実装します
  • JS 論理判断セレクターに関する一般的な議論 || &&
  • JavaScript のセレクターを理解する
  • Vue.js で iView 日付ピッカーを使用して開始時間と終了時間の検証機能を設定する

<<:  初心者向けウェブサイト構築ガイド⑦:美しいウェブサイトを作るのはとっても簡単

>>:  HTML ul および li タグを使用して画像を表示するサンプル コード

推薦する

Linux環境でのActiveMQ導入方法の詳しい説明

この記事では、Linux 環境での ActiveMQ の展開方法について説明します。ご参考までに、詳...

ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法

目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...

Dockerコンテナレイヤーの概念の詳細な説明

目次01 コンテナの一貫性02 レイヤーの概念03 レイヤードデザインの利点今日はコンテナ レイヤー...

tomcat デプロイメント プロジェクトの実装と IDEA との統合

目次Tomcat でプロジェクトを展開する 3 つの方法プロジェクトをwebappsディレクトリに直...

経験豊富な人が、プロフェッショナルで標準化されたMySQL起動スクリプトの開発方法を紹介します。

シェル スクリプト言語は、すべてのプログラミング言語の中で最も単純な言語であるため、資格のある Li...

Vueは複数の画像の追加、表示、削除を実装します

この記事では、Vueで複数の画像を追加、表示、削除するための具体的なコードを参考までに紹介します。具...

要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)

序文会社でのインターンシップ中、フロントエンド開発にはvue+element-uiフレームワークを使...

IE6 で CSS スタイルの div または li の背景のタイリングと境界の破損を解決する方法

IE6 で CSS スタイルの div または li の背景のタイリングや境界の破壊を解決するには、...

IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

css-vars-ポニーフィルCSS 変数を使用して Web ページのスキニングを実現すると、互換...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

MySQL InnoDB MRR 最適化ガイド

序文MRR は Multi-Range Read の略で、ランダム ディスク アクセスを削減し、ラン...

ウェブ標準学習リソースの素晴らしいコレクション

これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...

HTMLで境界線を設定する3つの方法の詳細な説明

HTML で境界線を設定する 3 つの方法 境界線の幅: 1px 2px 2px; 境界線のスタイル...

プロジェクトを素早く構築するためのvite+vue3.0+ts+element-plusの実装

目次バイト機能使用環境プロジェクトを構築する構成vite.config.ts tsconfig.js...

MySql データベースのサブクエリと高度なアプリケーションの簡単な分析

MySql データベースのサブクエリ:サブクエリ: 選択クエリ ステートメント内に別の選択ステートメ...