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 タグを使用して画像を表示するサンプル コード

推薦する

純粋な HTML タグにどれくらい精通していますか?

以下の HTML タグには、基本的に既存のタグがすべて含まれています。数分かけて 1 つずつ参照する...

React における同期および非同期 setState の問題のコード分析

React は Facebook の社内プロジェクトとして始まりました。 React の出現は革命的...

CSSで背景ぼかしを設定する方法

ページを作成するときに、ページの見栄えを良くするために、背景画像を設定する必要があることがよくありま...

ウェブページの要素の検査とソースコードの表示の違いについて

Chrome ブラウザで Web ページを開くと、ページを右クリックすると 2 つの非常によく似たオ...

Vue は better-scroll を使用して水平スクロール方法の例を実現します

1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...

VMware 12 での Ubuntu 16.04 インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04のインストールチュートリアルを参考までに...

HTML テーブルタグチュートリアル (12): 境界線スタイル属性 FRAME

FRAME プロパティを使用して、表の境界線のスタイル タイプを制御します。基本的な構文<T...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...

vitrualBox+ubuntu16.04 python3.6 最新チュートリアルと詳細な手順のインストール

最近ディープラーニングを学ぶためにUbuntu+Python 3.6バージョンを使う必要があるため、...

Ubuntu 20.04 に MySql5.7 をインストールして構成するための詳細なチュートリアル

目次1. Ubuntuソースの変更2. MySQLをインストールする3. 新しいユーザーを作成し、権...

複数の .sql ファイルを MySQL に効率的にインポートする方法の詳細な説明

MySQL には、複数の .sql ファイル (SQL ステートメントを含む) をインポートする方法...

MySQL マスタースレーブ構成の学習ノート

● 新しいプロジェクトのセキュリティを確保するためにクラウド データを購入する予定でした。 Alib...

Linux sftp コマンドの使用法の概要

sftp は、安全なファイル転送プロトコルである Secure File Transfer Prot...

ウェブページのアクセス速度に関する主な問題と解決策

<br />ウェブサイトのアクセス速度はウェブサイトのトラフィックに直接影響を及ぼし、ウ...

React スキャフォールディングの構築方法を学ぶ

1. フロントエンドエンジニアリングの複雑さいくつかの小さなデモ プログラムを開発するだけであれば、...