1. 概要コードを見ていると、基本的にquerySelector()とquerySelectorAll()を使って要素を取得しているのに、なぜgetElementById()が使われていないのか疑問に思いました。 1.1 querySelector() と querySelectorAll() の使用querySelector() メソッド
querySelectorAll() メソッド
1.2 getElement(s)Byxxxx の使用getElementById() メソッド
getElementsByTagName() メソッド
getElementsByClassName() メソッド
2. 違い2.1 getElement(s)Byxxxx は動的コレクションを取得し、querySelector は静的コレクションを取得します。動的とは、選択した要素がドキュメントとともに変更されることを意味し、静的とは、要素が取り出された後にドキュメントの変更とは関係がないことを意味します。 例1: <本文> <ul id="box"> <li class="a">テスト 1</li> <li class="a">テスト 2</li> <li class="a">テスト 3</li> </ul> </本文> <script type="text/javascript"> // ul を取得し、後で li を動的に追加します var ul = document.getElementById('box'); //既存の ul 内の li を取得します var リスト = ul.getElementsByTagName('li'); for(var i =0; i < list.length; i++){ ul.appendChild(document.createElement('li')); // liを動的に追加 } </スクリプト> 上記のコードは、i < list.length というループ条件で無限ループに陥ります。 例1の変更: for ループ条件を i < 4 に変更します。その結果、ul に 4 つの新しい要素が追加され、挿入される li タグの数は 7 になります。 <本文> <ul id="box"> <li class="a">テスト 1</li> <li class="a">テスト 2</li> <li class="a">テスト 3</li> </ul> </本文> <script type="text/javascript"> var ul = document.getElementById('box'); var リスト = ul.getElementsByTagName('li'); (var i = 0; i < 4; i++){ ul.appendChild(document.createElement('li')); } console.log('リストの長さ:',リストの長さ); </スクリプト> 例2: 次のコードの静的コレクションは、ul 内のすべての li を取得した後、.querySelectorAll('li') に反映されます。後で動的に li がいくつ追加されても、そのパラメータには影響しません。 <本文> <ul id="box"> <li class="a">テスト 1</li> <li class="a">テスト 2</li> <li class="a">テスト 3</li> </ul> </本文> <script type="text/javascript"> var ul = document.querySelector('ul'); var リスト = ul.querySelectorAll('li'); for(var i = 0; i < list.length; i++){ ul.appendChild(document.createElement('li')); } console.log('list.length:',list.length); //出力結果は3のままで、この時点でのliの数は6ではありません </スクリプト> なぜこのように設計されているのでしょうか?
Chrome で何が起こるか見てみましょう:
HTMLCollection は W3C で次のように定義されています。
実際、HTMLCollection と NodeList は非常によく似ています。どちらも要素の動的なコレクションであり、アクセスするたびにドキュメントの再クエリが必要になります。 var ul = document.getElementsByTagName('ul')[0], lis1 = ul.childNodes、 lis2 = ul.children; console.log(lis1.toString(), lis1.length); // "[オブジェクト NodeList]" 11 console.log(lis2.toString(), lis2.length); // "[オブジェクト HTMLCollection]" 4 NodeList オブジェクトには、要素、テキスト、コメントなど、ドキュメント内のすべてのノードが含まれます。 2.2 受信したパラメータが異なるquerySelectorAll メソッドによって受け取られるパラメータは CSS セレクターです。 var c1 = document.querySelectorAll('.b1 .c'); var c2 = document.getElementsByClassName('c'); var c3 = document.getElementsByClassName('b2')[0].getElementsByClassName('c'); 注: querySelectorAll が受け取るパラメータは、CSS セレクタ仕様に厳密に準拠している必要があります。<br /> 次の記述は例外をスローします (CSS セレクタ内の要素名、クラス、ID は数字で始めることはできません)。 試す { var e1 = document.getElementsByClassName('1a2b3c'); var e2 = document.querySelectorAll('.1a2b3c'); } キャッチ (e) { コンソールエラー(e.message); } コンソールにログ出力します。(e1 && e1[0].className); コンソールにログ出力します。(e2 && e2[0].className); 2.3 異なるブラウザの互換性querySelectorAll は、IE 8 以降、FF 3.5 以降、Safari 3.1 以降、Chrome、Opera 10 以降でサポートされています。 2.4 querySelectorはW3CのSelectors API仕様に属し、getElementsByシリーズはW3CのDOM仕様に属します。参考記事(侵害の場合は削除) JavaScript の querySelector メソッドと getElementById メソッドの違いについての記事はこれで終わりです。js の querySelector メソッドと getElementById メソッドの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...
さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...
この記事では、jQueryプラグインを使用してマインスイーパゲームを実装する2番目の記事を参考までに...
ドロップダウンボックス、テキストフィールド、ファイルフィールド 上半分はデモンストレーション効果、下...
目次序文:詳しい紹介:練習する:要約する序文: Python、Java、Cシリーズなど、すべての主要...
XAML レイアウトを使用する場合、インターフェイスを Metro 風にするために、一部のボタンでは...
目次etcdの機能etcdが独自の高可用性クラスタを構築するには、主に3つの形式があります。今回構築...
1. はじめにSELinux が Linux にもたらす主な価値は、柔軟で構成可能な MAC メカニ...
Nginx Rewriteの使用シナリオ1. URL アドレスジャンプ。たとえば、ユーザーが pm....
質問:オリジン サーバーはターゲット リソースの表現を見つけることができないか、既存の表現を公開した...
文字列連結ではなく path.join() メソッドを使用する必要があるのはなぜか疑問に思うかもしれ...
この記事では、フォームデータの非同期取得を実現するためのJavaScriptの具体的なコードを例とし...
目次1. リソースのダウンロード2. ソフトウェアを解凍する2.1 場所を選択する2.2 名前を変更...
Nginx を Web サーバーとして使用する際に、次の問題が発生しました。 1. nginxの起動...
1. 時刻の書式設定とその他の方法moment.jsライブラリファイルの使用をお勧めします2. テン...