JavaScript / DOM操作 / 画面から要素を取得する

JavaScript / DOM操作 / 画面から要素を取得する

画面にくっついている DOM を操作するために引き出す方法

万能取得関数 querySelector

過去にいくつか書き方があったが、これを使えばほぼ他の関数は必要ない。

jQuery でお馴染みになった CSS セレクタ風に指定して取得できる関数である。

ID 指定

var hoge = document.querySelector("#hoge");

querySelector は最初にヒットした DOM 1個だけを取り出す。

複数ヒットさせて配列として取り出したい場合は querySelectorAll を使う

クラス指定

var hoge = document.querySelectorAll(".hoge");

これにより取得できるものは、普通に DOM のコレクションであって、jQuery のような、集合体の概念は無い。 なので塊に対する一括操作など無い。

検索した範囲からさらに検索

jQuery でいう find 関数のような動きをするため

// jQuery
var piyo = $("#hoge").find(".piyo");
 
// Vanilla
var piyo = document.querySelector("#hoge").querySelectorAll(":scope .piyo");

この :scope という記述がその前述の範囲(この場合は#hoge)を表すセレクタになっている。 これは body 中に範囲を限定して書くstyleタグ内での記述という仕様らしい。

この場合 :scope の記述を省略すると子孫セレクタを指定した場合と同じ挙動になる。 つまり対象の DOM 配下からすべて検索することになる。孫は必要なく直下の子供からほしい場合は

このように明示的に :scope を記述する必要がある。

var piyo = document.querySelector("#hoge").querySelectorAll(":scope > .piyo");

できそうな雰囲気はあるが、このように書くとエラーになる

var piyo = document.querySelector("#hoge").querySelectorAll("> .piyo");

モトモコモ無いがこのように書くと動作はする。

var piyo = document.querySelector("#hoge").querySelectorAll("#hoge > .piyo");

そして意味的にも正しい結果を得ることができる。

この結果は構造によっては、これと同じになる。

var piyo = document.querySelector("#hoge").querySelectorAll("body .piyo");

.piyo 画面上に大量にあろうが #hoge 配下でフィルタされた内容になる。 非常に挙動が分かりづらいが挙動としてはこうである。

メソッドとして querySelectorquerySelectorAlldocument もしくは querySelector で得られるようなオブジェクトにしか装備されていない。

つまり、セレクタのようなザックリここらへんのような対象ではなく、必ず画面上の特定のオブジェクトを起点にしなければならない、なので実際に検索した範囲からさらに検索するような動きをするには、CSS のセレクタのような使い方はできず、目的のオブジェクトをセレクタ指定できる1個手前まで1段1段潜って書く必要がある。

前述のように querySelectorAll の結果は jQuery とは違い、集合体という概念ではなくて、実オブジェクトの集合なので、集合と集合の共通部分を取るのような集合演算はできない。

チェックされたモノだけ取り出す

var hoge = document.querySelectorAll("hoge input[type=checkbox]:checked");

id 指定で取り出す

定番モノ。動作としては最速だと思うのでこれを使う価値はある。

var hoge = document.getElementById("hoge");

クラス指定で取出す

querySelector を使うようになればもうこの記述で書くことは無い。

↓過去の記述

2015-10-19 現在ほぼ実用的に document.getElementsByClassName が使えるようだ Can I use... Support tables for HTML5, CSS3, etc

var a = document.getElementsByClassName("hogehoge");

すべてのノードを取得

var a = document.getElementsByTagName("*");
javascript/ope/dom_ope/select_dom.txt · 最終更新: 2020-10-22 18:16 by ore