<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sizzle &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/sizzle/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Mon, 16 Dec 2013 01:57:03 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;querySelector&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/16/jaac2013-q-queryselector.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 16 Dec 2013 01:57:03 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[querySelector]]></category>
		<category><![CDATA[Sizzle]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3741</guid>

					<description><![CDATA[&#8220;Q&#8221; は querySelector の &#8220;Q&#8221;。 querySelector / querySelectorAll querySelector / querySelec [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;Q&#8221; は querySelector の &#8220;Q&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-D1beID9BBbY/UqR4klzFRzI/AAAAAAAACYg/rJ8BHc8ogu0/s400/ac2013-q.png" alt="Q"/></figure>



<p></p>



<span id="more-3741"></span>



<h2 class="wp-block-heading">querySelector / querySelectorAll</h2>



<p><strong>querySelector</strong> / <strong>querySelectorAll</strong> は、&#8221;#container .section&#8221; のようなCSSのセレクタで要素を絞り込んで取得する為のAPIです。 旧来jQuery等で使われていた要素の取得がネイティブのAPIとして実装されたと考えれば、特に難しいことはないですね。 IEは8以降でこの機能をサポートしていますが、IE8ではCSS2のセレクタのみ使用可能となっています。</p>



<p>querySelector[All] は document から呼び出して使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">document</span><span class="hljs-selector-class">.querySelector</span>("<span class="hljs-selector-id">#container</span> <span class="hljs-selector-class">.section</span>");
<span class="hljs-selector-tag">document</span><span class="hljs-selector-class">.querySelectorAll</span>("<span class="hljs-selector-id">#container</span> <span class="hljs-selector-class">.section</span>");
</code></span></pre>


<p>両者の違いは取得する要素の数です。 querySelector は条件に合致した最初の要素だけを返し、 querySelectorAll は合致した全ての物を返します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"container"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"section section-01"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"section section-02"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"section section-03"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-keyword">var</span> firstSection = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">"#container .section"</span>); <span class="hljs-comment">// HTMLDivElement</span>
    <span class="hljs-keyword">var</span> allSections = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">"#container .section"</span>); <span class="hljs-comment">// NodeList</span>
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>querySelectorAll で返される <strong>NodeList</strong> は Arrayライクなオブジェクトで、 配列のように添字で取得できるほか、インデックスで要素を返す <strong>item()</strong> メソッドが使用できます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// これらは同じ要素を返します</span>
allSections&#91;<span class="hljs-number">0</span>];
allSections.item(<span class="hljs-number">0</span>);
</code></span></pre>


<h3 class="wp-block-heading">他の要素取得系APIと比べて</h3>



<p>要素の取得と言えば、<strong>getElementById</strong> / <strong>getElementsByClassName</strong> / <strong>getElementsByTagName</strong> がありますが、 想像に難くないようにこれらの方が高速な為、場面による使い分けが大切です。</p>



<p>使い分けが面倒、あるいは毎度 <strong>document&#8230;</strong> と書くのが鬱陶しい場合は、 セレクタから判別して処理する関数を書いてみても良いかもしれません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> _query = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">selector</span>)</span>{
    <span class="hljs-keyword">var</span> nodes;
    <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^#&#91;\w\-]+$/</span>.test(selector)){
        <span class="hljs-keyword">return</span> &#91;<span class="hljs-built_in">document</span>.getElementById(
            selector.replace(<span class="hljs-regexp">/^#/</span>, <span class="hljs-string">""</span>)
        )];
    }
    <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^\.&#91;\w\-]+$/</span>.test(selector)){
        nodes = <span class="hljs-built_in">document</span>.getElementsByClassName(
            selector.replace(<span class="hljs-regexp">/^\./</span>, <span class="hljs-string">""</span>)
        );
    } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>((<span class="hljs-regexp">/^&#91;a-z]+$/i</span>).test(selector)) {
        nodes = <span class="hljs-built_in">document</span>.getElementsByTagName(selector);
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-keyword">try</span> {
            nodes = <span class="hljs-built_in">document</span>.querySelectorAll(selector);
        } <span class="hljs-keyword">catch</span>(e){
            nodes = &#91;];
        }
    }
    <span class="hljs-keyword">return</span> &#91;].slice.call(nodes);
};
_query(<span class="hljs-string">"#container"</span>); <span class="hljs-comment">// Array</span>
_query(<span class="hljs-string">".section"</span>); <span class="hljs-comment">// Array</span>
_query(<span class="hljs-string">"div"</span>); <span class="hljs-comment">// Array</span>
_query(<span class="hljs-string">"#container .section"</span>); <span class="hljs-comment">// Array</span>
</code></span></pre>


<p>ここで使われる id や class の文字については半角英数字とハイフン/アンダースコアのみに絞っています。 ついでに、forEach などが使えるように NodeList から配列に変換しています。</p>



<p>ただ、この場合は正規表現などのコストで有り難みが半減するかもしれません。</p>



<h3 class="wp-block-heading">jQuery（Sizzle）と比べて</h3>



<p>jQueryの独自のセレクタは要素を1つずつ検証していく為、やはりネイティブの querySelector に比べて速度が落ちてしまいます。 そのためjQueryは、</p>



<ol class="wp-block-list">
<li>id や class やタグ名を渡された場合はそれに相応しいネイティブAPIを使用し、</li>



<li>ブラウザが querySelector が対応しているかどうかをチェックし、</li>



<li>querySelector で正常に解釈できるセレクタであるかどうかのテストを行い、</li>



<li>失敗した場合（例えばjQuery独自の記法が使用されていた場合）に自分のAPIを使用して要素を抽出する</li>
</ol>



<p>こんな感じのプロセスを踏んでいる様です。</p>



<p>つまりjQueryを使用する場合でも、まずは id や class で絞込み、 それに対して .find() などでフィルタリングする事で速度が改善しそうですね。</p>



<p>こちらで詳しく説明されています。</p>



<ul class="wp-block-list">
<li><a href="http://73log.jp/jquery-selector-speed/">jQueryのセレクタ高速化について | JavaScript | 73log.jp</a></li>
</ul>



<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="https://developer.mozilla.org/ja/docs/Web/API/document.querySelector">document.querySelector &#8211; Web API リファレンス | MDN</a></li>



<li><a href="https://developer.mozilla.org/ja/docs/Web/API/document.querySelectorAll">document.querySelectorAll &#8211; Web API リファレンス | MDN</a></li>



<li><a href="http://73log.jp/jquery-selector-speed/">jQueryのセレクタ高速化について | JavaScript | 73log.jp</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
