JS勉強記⑥getElementsByメソッド
タグ名をキーに要素を取得
指定したHTMLタグ名をキーに要素を取得する。基本構文は以下の通り。
document.getElementsByTagName('タグ名');
※指定したタグ名が存在しない場合は空のHTMLCollection([])を返す。nullではない!
※HTMLCollectionとは配列に似たデータのこと。詳しくは後述。
例題
複数の要素とボタンを配置。タグ名がdivの要素を取得し、その内容をコンソールに出力する。HTMLのbodyは下記の通り。
<body>
<div>りんご(div)</div>
<p>もも</p>
<div>いちご(div)</div>
<span>なし</span>
<div>ぶどう</div>
<input type="button" value="取得" onclick="showElements()">
<script src="js/elements_tag_name.js"></script>
</body>
inputのonclickプロパティでクリック時にshowElements関数を実行する様あらかじめ設定。
jsは下記の通り。
function showElements() {
const elements = document.getElementsByTagName('div');
for (let i = 0; i < elements.length; i++) {
console.log(elements[i].innerText);
}
}
①function命令でshowElements関数を定義。
②変数elementsを宣言し、getElementsByTagNameメソッドで要素を呼び出すタグを'div'に指定。(=elementsにdivが配列として含まれる)
③変数elementsを取り出す繰り返し処理を設定。変数iを宣言し(繰り返し処理なのでconstではなくletで宣言)、その初期条件は0、繰り返す条件はiが変数elementsの配列に格納されている個数より小さい間(=divの個数の最大数より小さい間)、その条件が成立する間は変数iにインクリメントする。
④elements変数のコンソールへの出力を設定。実際に取り出したいのはdivのテキストなので.innerTextプロパティを記載する。
⑤HTMLでのdivタグのテキストが「りんご」「いちご」「ぶどう」なので、これらのテキストがコンソールに出力されていればOK。
MEMO:配列が入ってくるのでわかりにくいが、配列をコンソールに出力するためにはindex(配列の順番)は0からスタートし1,2,…とカウントしなければいけない。今回divは3つあるので、indexはelements[0],[1],[2]で打ち止め。そのためfor分の条件は「i < elements.length;」(elementsの配列に含まれるdivの実際の個数より小さい)となる。勉強記③の演習と同じ感じ!
name属性をキーに要素を取得
指定したname属性をキーに要素を取得する。基本構文は以下の通り。
document.getElementsByName('name属性の値');
※指定したタグ名が存在しない場合は空のHTMLCollection([])を返す。nullではない!
例題
テキストボックスとボタンを配置。テキストボックスに任意の文字列を入力しボタンを押すと、任意の文字列がコンソールに出力される。HTMLのbodyは下記の通り。
<body>
<input type="text" name="result">
<input type="button" value="取得" onclick="showElements()">
<script src="js/elements_name.js"></script>
</body>
先ほどと同様にボタンを押したときの動作としてshowElements関数をあらかじめ設定。
jsは以下の通り。
function showElements() {
const elements = document.getElementsByName('result');
console.log(elements[0].value);
}
①function命令でshowElements関数を定義。
②変数elementsを宣言し、getElementsByNameメソッドで要素を呼び出すname属性を'result'に指定。
③変数elementsのコンソールへの出力を設定。.valueプロパティでテキストボックスに入力された文字列を取り出す。
⑤テキストボックスに入力した文字列がコンソールに出力されていればOK。
class属性をキーに要素を取得
指定したclass属性をキーに要素を取得する。基本構文は以下の通り。
document.getElementsByClassName('class属性の値');
※指定したタグ名が存在しない場合は空のHTMLCollection([])を返す。nullではない!
例題
リスト(複数)とボタンを設置。ボタンをクリックしたらclass名が'foo'の要素を取得し、その内容をコンソールに出力する。HTMLのbodyは下記の通り。
<body>
<ul>
<li class="foo">ネコ</li>
<li class="bar">イヌ</li>
<li class="foo">たぬき</li>
<li>きつね</li>
<li class=bar"">ねずみ</li>
</ul>
<input type="button" value="取得" onclick="showElements()">
<script src="../js_dom/js/elements_class.js" charset="utf-8"></script>
</body>
先ほどと同様にボタンを押したときの動作としてshowElements関数をあらかじめ設定。
jsは以下の通り。
function showElements() {
const elements = document.getElementsByClassName('foo');
for (let i = 0; i < elements.length; i++){
console.log(elements[i].innerText);
}
}
①function命令でshowElements関数を定義。
②変数elementsを宣言し、getElementsByClassNameメソッドで要素を呼び出すclass名を'foo'に指定。(=elementsにclass名が'foo'の要素が配列として含まれる)
③変数elementsを取り出す繰り返し処理を設定。変数iを宣言し(繰り返し処理なのでconstではなくletで宣言)、その初期条件は0、繰り返す条件はiが変数elementsの配列に格納されている個数より小さい間(=class名が'foo'の要素の個数の最大数より小さい間)、その条件が成立する間は変数iにインクリメントする。
④elements変数のコンソールへの出力を設定。実際に取り出したいのはclass名が'foo'の要素のテキストなので.innerTextプロパティを記載する。
⑤HTMLでのclass名が'foo'である要素のテキストが「ネコ」「たぬき」なので、これらのテキストがコンソールに出力されていればOK。
呼び出しキー(Id/TagName/Name/ClassName)の使い分け
id属性:1つのHTMLの中で1つしか使えないユニーク属性なのでid属性を設定した要素のみ呼び出したい場合に使用。構文も唯一getElement(単数形)表記。
タグ名・class属性:呼び出したいキーによって使い分ける。要素でくくって呼び出したいときはTagName、複数タグにまたがって呼び出したいときはClassNameでそれぞれ記述する。構文はgetElements(複数形)表記。
name属性:本来は複数あるものかもしれないので構文はgetElements(複数形)表記。今回はname属性を持っているのは1つ目のinput要素だけなのでfor分は不要だったが、コンソールに出力する際は配列とおなじ記述(elements[0])をする。
class属性とname属性の使い分けがよくわからんが、name属性は現在のブラウザでは限定的な要素(form,input)等にしか使用されていないようなので、基本的にはId/TagName/ClassNameでキーは事足りると思われる。
【参考リンク】
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByName
https://t32k.me/mol/log/getelementsbyname-and-getelementsbyclassname/