DOMおれおれAdvent Calendar 2015 – 02日目
ちょっとだけ要素を操作したくてそれだけのためにjQuery読み込むのもちょっとアレよね、みたいなときに便利なやつです。
こんな具合です。
var el = document.querySelector('body #foo ul.bar:first-child > li');
document
だけじゃなくて各要素でも使えるので、jQueryの .find()
みたいな使い方もできます。
var elBlock = document.querySelector('body #foo'); var el = elBlock.querySelector('ul.bar:first-child > li');
ただしあくまでセレクターを指定するので、 “>” で始まるやつは駄目です、エラーになります。(jQueryはできる。)
var elList = document.querySelector('body #foo ul.bar:first-child'); var el = elBlock.querySelector('> li'); // An invalid or illegal string was specified
複数探す場合
querySelector()
はセレクターに合致した最初の要素ひとつを返します。複数の要素が必要な場合は querySelectorAll()
を使います。
var els = document.querySelectorAll('body #foo ul.bar:first-child > li'); for (var i=0, l=els.length; i<l; i++) { var el = els[i]; console.log(el); }
これも document
でも各要素でも使えます。
戻り値はNodeListという配列風オブジェクトです。 forEach()
は持っていません。使いたければ配列の方を呼び出して使う感じ。
var els = document.querySelectorAll('body #foo ul.bar:first-child > li'); Array.prototype.forEach.call(els, function(el, index) { console.log(el); });
その他
IEも8から対応しているので、割と気軽に使えるかと思います。
単純にひとつのクラス名やIDで検索する場合には、また別のAPIを使う事もできます。そっちの方が高速なんだけど、こっちので統一して書くって方針でもいいんじゃないかな。そもそもそんなに書かないでしょ。
jQueryの影響を受けて策定されたAPIかなって思ってるんだけど、具体的な経緯とかは調べてないです。ご存知の方、お教えくださいまし。