Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1128583 of NodeList

  • リビジョンの URL スラグ: Web/API/NodeList
  • リビジョンのタイトル: NodeList
  • リビジョンの ID: 1128583
  • 作成日:
  • 作成者: hashedhyphen
  • 現行リビジョン? はい
  • コメント リンクの修正

このリビジョンの内容

{{APIRef("DOM")}}

NodeList オブジェクトは DOM ノードの集合を表すオブジェクトであり、 {{domxref("Node.childNodes")}} や {{domxref("document.querySelectorAll")}} メソッドの戻り値として用いられます。

NodeListArray と異なりますが、forEach() メソッドで処理を順次適用することは可能です。ただし、このメソッドは古いブラウザで実装されていない場合があります。

NodeList オブジェクトの中には、DOM に対する変更がリアルタイムで反映されるものもあります。例えば、{{domxref("Node.childNodes")}} はこの性質を有しています。

var parent = document.getElementById('parent');
var child_nodes = parent.childNodes;
console.log(child_nodes.length); // ここでの値が "2" だった場合、
parent.appendChild(document.createElement('div'));
console.log(child_nodes.length); // この出力は "3" となるはずです。

対して、DOM への変更が NodeList オブジェクトの内容に影響を与えないものもあります。{{domxref("document.querySelectorAll")}} メソッドは、そのような静的な NodeList を返します。

NodeList の各要素に処理を順次適用させたい際、またリストの長さを保存しておきたい際には、上で述べた違いがあることを念頭に置くようにしてください。

プロパティ

{{domxref("NodeList.length")}}
NodeList に含まれるノードの数

メソッド

 
{{domxref("NodeList.item()")}}
指定されたインデックスに対応するリスト内の要素を返します。ただし、インデックスが範囲外の場合は null を返します。このメソッドは、シンプルなアクセス方法の nodeList[idx] (この場合、idx が範囲外の時には undefined が返ります)の代替として利用できます。
{{domxref("NodeList.entries()")}}
{{jsxref("Iteration_protocols","iterator")}} を返します。このオブジェクトにより、すべてのキー・値の組について処理を回すことができます。
{{domxref("NodeList.forEach()")}}
与えられた関数を NodeList の各要素に対して実行します。
{{domxref("NodeList.keys()")}}
{{jsxref("Iteration_protocols", "iterator")}} を返します。このオブジェクトにより、すべてのキーについて処理を回すことができます。
{{domxref("NodeList.values()")}}
{{jsxref("Iteration_protocols", "iterator")}} を返します。このオブジェクトにより、すべての値について処理を回すことができます。

NodeList の各要素について処理を順次適用するには、以下のような方法があります。

for (var i = 0; i < myNodeList.length; ++i) {
  var item = myNodeList[i];  // JavaScript では myNodeList.item(i) を呼び出す必要はありません
}

リストの要素について処理を回すために for...infor each...in を用いてはいけません。なぜなら、NodeList のプロパティである要素に加えて、length プロパティについても処理が適用されるため、{{domxref("element")}} オブジェクトのみ処理すべきスクリプトではエラーが生じます。また、for..in で取得されるプロパティの順番は保証されていません。

for...of ループであれば、NodeList オブジェクトを正しく扱うことができます。

var list = document.querySelectorAll( 'input[type=checkbox]' );
for (var item of list) {
  item.checked = true;
}

最近のブラウザでは、イテレータに基づくメソッドとして {{domxref("NodeList.forEach()", "forEach()")}} や {{domxref("NodeList.entries()", "entries()")}}、{{domxref("NodeList.values()", "values()")}}、{{domxref("NodeList.keys()", "keys()")}} がサポートされています。

仕様

仕様書 策定状況 備考
{{SpecName('DOM WHATWG', '#interface-nodelist', 'NodeList')}} {{ Spec2('DOM WHATWG') }}  
{{SpecName('DOM4', '#interface-nodelist', 'NodeList')}} {{ Spec2('DOM4') }}  
{{SpecName('DOM3 Core', 'core.html#ID-536297177', 'NodeList')}} {{ Spec2('DOM3 Core') }}  
{{SpecName('DOM2 Core', 'core.html#ID-536297177', 'NodeList')}} {{ Spec2('DOM2 Core') }}  
{{SpecName('DOM1', 'level-one-core.html#ID-536297177', 'NodeList')}} {{ Spec2('DOM1') }} 初期定義

ブラウザ実装状況

{{CompatibilityTable}}
機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}}
entries(), keys(), values(), forEach() {{CompatUnknown}} {{CompatGeckoDesktop("50.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
機能 Android Android Webview Firefox Mobile (Gecko) Firefox OS (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
基本サポート {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}}
entries(), keys(), values(), forEach() {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile("50.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}

このリビジョンのソースコード

<div>{{APIRef("DOM")}}</div>

<p><strong><code>NodeList</code></strong>&nbsp;オブジェクトは DOM ノードの集合を表すオブジェクトであり、 {{domxref("Node.childNodes")}} や {{domxref("document.querySelectorAll")}} メソッドの戻り値として用いられます。</p>

<div class="note">
<p><code>NodeList</code> は <code>Array</code> と異なりますが、<code>forEach()</code> メソッドで処理を順次適用することは可能です。ただし、このメソッドは古いブラウザで実装されていない場合があります。</p>
</div>

<p><code>NodeList</code> オブジェクトの中には、DOM に対する変更がリアルタイムで反映されるものもあります。例えば、{{domxref("Node.childNodes")}} はこの性質を有しています。</p>

<pre class="brush: js line-numbers  language-js">
<code class="language-js"><span class="keyword token">var</span> parent <span class="operator token">=</span> document<span class="punctuation token">.</span><span class="function token">getElementById</span><span class="punctuation token">(</span><span class="string token">'parent'</span><span class="punctuation token">)</span><span class="punctuation token">;</span>
<span class="keyword token">var</span> child_nodes <span class="operator token">=</span> parent<span class="punctuation token">.</span>childNodes<span class="punctuation token">;</span>
console<span class="punctuation token">.</span><span class="function token">log</span><span class="punctuation token">(</span>child_nodes<span class="punctuation token">.</span>length<span class="punctuation token">)</span><span class="punctuation token">;</span> <span class="comment token" spellcheck="true">// ここでの値が "2" だった場合、</span>
parent<span class="punctuation token">.</span><span class="function token">appendChild</span><span class="punctuation token">(</span>document<span class="punctuation token">.</span><span class="function token">createElement</span><span class="punctuation token">(</span><span class="string token">'div'</span><span class="punctuation token">)</span><span class="punctuation token">)</span><span class="punctuation token">;</span>
console<span class="punctuation token">.</span><span class="function token">log</span><span class="punctuation token">(</span>child_nodes<span class="punctuation token">.</span>length<span class="punctuation token">)</span><span class="punctuation token">;</span> <span class="comment token" spellcheck="true">// この出力は "3" となるはずです。
</span></code></pre>

<p>対して、DOM への変更が <code>NodeList</code> オブジェクトの内容に影響を与えないものもあります。{{domxref("document.querySelectorAll")}} メソッドは、そのような静的な <code>NodeList</code> を返します。</p>

<p><code>NodeList</code> の各要素に処理を順次適用させたい際、またリストの長さを保存しておきたい際には、上で述べた違いがあることを念頭に置くようにしてください。</p>

<h2 id="プロパティ">プロパティ</h2>

<dl>
 <dt>{{domxref("NodeList.length")}}</dt>
 <dd><code>NodeList</code> に含まれるノードの数</dd>
</dl>

<h2 id="メソッド">メソッド</h2>

<dl>
 <dt>&nbsp;</dt>
 <dt>{{domxref("NodeList.item()")}}</dt>
 <dd>指定されたインデックスに対応するリスト内の要素を返します。ただし、インデックスが範囲外の場合は <code>null</code> を返します。このメソッドは、シンプルなアクセス方法の <code>nodeList[idx]</code> (この場合、<code>idx</code> が範囲外の時には <code>undefined</code> が返ります)の代替として利用できます。</dd>
 <dt>{{domxref("NodeList.entries()")}}</dt>
 <dd>{{jsxref("Iteration_protocols","iterator")}} を返します。このオブジェクトにより、すべてのキー・値の組について処理を回すことができます。</dd>
 <dt>{{domxref("NodeList.forEach()")}}</dt>
 <dd>与えられた関数を <code>NodeList</code> の各要素に対して実行します。</dd>
 <dt>{{domxref("NodeList.keys()")}}</dt>
 <dd>{{jsxref("Iteration_protocols", "iterator")}} を返します。このオブジェクトにより、すべてのキーについて処理を回すことができます。</dd>
 <dt>{{domxref("NodeList.values()")}}</dt>
 <dd>{{jsxref("Iteration_protocols", "iterator")}} を返します。このオブジェクトにより、すべての値について処理を回すことができます。</dd>
</dl>

<h2 id="例">例</h2>

<p><code>NodeList</code> の各要素について処理を順次適用するには、以下のような方法があります。</p>

<pre class="brush: js line-numbers  language-js">
<code class="language-js"><span class="keyword token">for</span> <span class="punctuation token">(</span><span class="keyword token">var</span> i <span class="operator token">=</span> <span class="number token">0</span><span class="punctuation token">;</span> i <span class="operator token">&lt;</span> myNodeList<span class="punctuation token">.</span>length<span class="punctuation token">;</span> <span class="operator token">++</span>i<span class="punctuation token">)</span> <span class="punctuation token">{</span>
  <span class="keyword token">var</span> item <span class="operator token">=</span> myNodeList<span class="punctuation token">[</span>i<span class="punctuation token">]</span><span class="punctuation token">;</span>  <span class="comment token" spellcheck="true">// JavaScript では myNodeList.item(i) を呼び出す必要はありません</span>
<span class="punctuation token">}</span></code></pre>

<p>リストの要素について処理を回すために <code><a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in" title="JavaScript/ Reference/Statements/for...in">for...in</a></code> や <code><a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for_each...in" title="JavaScript/ Reference/Statements/for each...in">for each...in</a></code> を用いてはいけません。なぜなら、<code>NodeList</code> のプロパティである要素に加えて、length プロパティについても処理が適用されるため、{{domxref("element")}} オブジェクトのみ処理すべきスクリプトではエラーが生じます。また、<code>for..in</code> で取得されるプロパティの順番は保証されていません。</p>

<p><code><a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of" title="/en-US/docs/JavaScript/Reference/Statements/for...of">for...of</a></code> ループであれば、<code>NodeList</code> オブジェクトを正しく扱うことができます。</p>

<pre class="brush: js line-numbers  language-js">
<code class="language-js"><span class="keyword token">var</span> list <span class="operator token">=</span> document<span class="punctuation token">.</span><span class="function token">querySelectorAll</span><span class="punctuation token">(</span> <span class="string token">'input[type=checkbox]'</span> <span class="punctuation token">)</span><span class="punctuation token">;</span>
<span class="keyword token">for</span> <span class="punctuation token">(</span><span class="keyword token">var</span> item <span class="keyword token">of</span> list<span class="punctuation token">)</span> <span class="punctuation token">{</span>
  item<span class="punctuation token">.</span>checked <span class="operator token">=</span> <span class="keyword token">true</span><span class="punctuation token">;</span>
<span class="punctuation token">}</span></code></pre>

<p>最近のブラウザでは、イテレータに基づくメソッドとして {{domxref("NodeList.forEach()", "forEach()")}} や {{domxref("NodeList.entries()", "entries()")}}、{{domxref("NodeList.values()", "values()")}}、{{domxref("NodeList.keys()", "keys()")}} がサポートされています。</p>

<article class="approved text-content">
<div class="boxed translate-rendered">
<h2 id="Specifications" name="Specifications">仕様</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
   <th scope="col">策定状況</th>
   <th scope="col">備考</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('DOM WHATWG', '#interface-nodelist', 'NodeList')}}</td>
   <td>{{ Spec2('DOM WHATWG') }}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('DOM4', '#interface-nodelist', 'NodeList')}}</td>
   <td>{{ Spec2('DOM4') }}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('DOM3 Core', 'core.html#ID-536297177', 'NodeList')}}</td>
   <td>{{ Spec2('DOM3 Core') }}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('DOM2 Core', 'core.html#ID-536297177', 'NodeList')}}</td>
   <td>{{ Spec2('DOM2 Core') }}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('DOM1', 'level-one-core.html#ID-536297177', 'NodeList')}}</td>
   <td>{{ Spec2('DOM1') }}</td>
   <td>初期定義</td>
  </tr>
 </tbody>
</table>

<h2 id="ブラウザ実装状況">ブラウザ実装状況</h2>

<div>{{CompatibilityTable}}</div>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>機能</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>基本サポート</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
  <tr>
   <td><code>entries()</code>, <code>keys()</code>, <code>values()</code>, <code>forEach()</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatGeckoDesktop("50.0")}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>機能</th>
   <th>Android</th>
   <th>Android Webview</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>Firefox OS (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
   <th>Chrome for Android</th>
  </tr>
  <tr>
   <td>基本サポート</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
  <tr>
   <td><code>entries()</code>, <code>keys()</code>, <code>values()</code>, <code>forEach()</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatGeckoMobile("50.0")}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>
</div>
</article>
このリビジョンへ戻す