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かなって思ってるんだけど、具体的な経緯とかは調べてないです。ご存知の方、お教えくださいまし。
