* 仕様書

[REFS[
- [15] [CITE@en-US[DOM Standard]] ([TIME[2012-12-07 13:41:03 +09:00]] 版) <http://dom.spec.whatwg.org/#interface-nodelist>
]REFS]

* 利用箇所

[FIG(list middle)[ [16] [CODE(DOMi)@en[[[NodeList]]]] の利用箇所

- [CODE(DOMi)@en[[[Node]]]]
-- [CODE(DOMa)@en[[[childNodes]]]]
- [CODE(DOMi)@en[[[ParentNode]]]]
-- [CODE(DOMm)@en[[[querySelectorAll]]]] ※
- [CODE(DOMi)@en[[[Document]]]]
-- [CODE(DOMm)@en[[[getItems]]]]
-- [CODE(DOMm)@en[[[getElementsByName]]]]
- [[名札付け可能要素]]
-- [CODE(DOMi)@en[[[labels]]]]
- [CODE(DOMi)@en[[[MutationRecords]]]]
-- [CODE(DOMa)@en[[[addedNodes]]]] ※
-- [CODE(DOMa)@en[[[removedNodes]]]] ※
- [CODE(DOMi)@en[[[HTMLOptionsCollection]]]]
-- [DEL[[CODE(DOMm)@en[[[namedItem]]]]]]
]FIG]

;; [25] 「※」以外は [[live]] です。

[FIG(list middle)[ [17] [CODE(DOMi)@en[[[NodeList]]]] を[[継承]]した[[インターフェイス]]
- [CODE(DOMi)@en[[[RadioNodeList]]]]
- [CODE(DOMi)@en[[[MathMLNodeList]]]]

[HISTORY[
- [CODE(DOMi)@en[PropertyNodeList]]
- [CODE(DOMi)@en[StaticNodeList]]
]HISTORY]
]FIG]


* 関連

[18] [CODE(DOMi)@en[[[HTMLCollection]]]], [CODE(DOMi)@en[[[NamedNodeMap]]]] などと似ていますが、
[[継承]]関係にはありません。

* 歴史

[19] 元々の [[DOM0]] に基づく[[集成]]は [CODE(DOMi)@en[[[HTMLCollection]]]] の方で、
[CODE(DOMi)@en[[[NodeList]]]] は後から [[DOM1]] で追加されたものです。

[1] [CODE(DOMi)[NodeList]] 界面は、 [CODE(DOMi)[[[Node]]]]
の[[順序付き]]の[[集まり]]を扱います。
この集まりをどう実装するかは定義・制約されていません。

[2]
,method	,[CODE(DOMm)[[[item]]]]	,項目を取得	,[DOM1]
,読取専用属性	,[CODE(DOMa)[[[length]]]]	,個数	,[DOM1]

[3] どう実装するかは定義しないとしながらも、 >>2
の界面定義はかなりの制約です。
多くの[[プログラム言語]]は[[配列]]の仕組みを持っていますが、
この定義では必ずしもそれを利用出来ません。
([[DOM]] の最初の実装である [[JavaScript]]
の流儀に強く影響されています。)

例えば [[perl]] の束縛なら、 [CODE(perl)[[VAR[$i]]]]
番目の項目 (節) は [CODE(perl)[ $$node_list [$i] ]]
で、個数は [CODE(perl)[ scalar @$node_list ]]
で取得したいところです。 (perl の場合は、適当な class
に [[bless]] しておけば DOM 式と perl 
式を同時に実装できますね。)

[4] なお、項目番号 ([CODE(DOMattr)[index]])
は [CODE(DOM)[0]] から始まります。
これも束縛先言語との流儀の絡みであまり嬉しい制約ではありません。
(しかしながら、最初の索引番号を何にす(な)るか考えなくて良いと言う意味では嬉しい制約です。)

- [DOM1] ''Document Object Model (Core) Level 1'' <http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-536297177>
- [DOM2] ''Document Object Model Core'' <http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-536297177>
- [5] >>3 DOM の仕様書の附属書 (参考) の [[ECMAScript]] 束縛では、 [CODE(JS)[ [VAR[NodeList]][ [VAR[i]] ] ]] と [CODE(JS)[ [VAR[NodeList]].item ( [VAR[i]] ) ]] は等価とされていますから、 >>3 は真っ当な実装だと思います。
- [6] [CODE(DOMi)[NodeList]] は[[活性]]です。例えば、ある要素節の子節群である [CODE(DOMi)[NodeList]] を得たら、その要素の子節を追加とか削除とかした時に、特に何も指示しなくてもその [CODE(DOMi)[NodeList]] は最新の内容になっている必要があります。
- [7] >>6 の説明は分かりにくいですが <http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#attribute-childNodes> にもあって、そこでは更に「この性質は ([CODE(DOMattr)[[[childNodes]]]] だけではなく) [CODE(DOMmethod)[[[getElementsByTagName]]]] などで得た [CODE(DOMi)[NodeList]] にも適用される」と述べています。 (違う method の説明にわざわざかくなんて、[CODE[スコア −1: 余計なもの]]です。 ) しかし、これは FE Errata で削除されています。 (予想ですが、この文言は、 get... の検索結果が随時変わる (木に変更が加えられるたびに検索しなおす) 必要があるように解釈出来ますが、そういう解釈は間違いということで削除したんじゃないでしょうか? (ちゃんと削除理由も書いて欲しいなあ。))
- [8] >>7 ほんとにその解釈が正しいとしたら、下手に木は操作できなくて、すごいことになりそう。
- [9] >>7-8 [CODE(DOMi)[NodeList]] を継承する [CODE(DOMi)[[[MathMLNodeList]]]] では、属性値的意味の節群である時についてのみ、活性であると言及しています。これから推測して、 >>7 は正しい (get... method の返り値では、やはり (再検索するという意味での) 活性ではないのではないでしょうか。) <http://www.w3.org/TR/MathML2/appendixd.html#dom_NodeList>
- [10] 似た界面として、 [CODE(DOMi)[[[NamedNodeMap]]]] があります。 [CODE(DOMi)[NodeList]] が[[配列]]なら、 [CODE(DOMi)[NamedNodeMap]] は[[連想配列]]です。

[11]
[CITE[Bug 14547 - typeof document.body.childNodes=="function" ("object" expected)]] ([CODE[2008-03-22 22:09:03 +09:00]] 版) <http://bugs.webkit.org/show_bug.cgi?id=14547>

[12] [CITE[IRC logs: freenode / #whatwg / 20100121]]
([TIME[2010-01-23 15:13:04 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20100121#l-360>

[13] [CITE@en[HTML5 Revision Tracker]]
([TIME[2010-02-13 23:02:00 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4701&to=4702>

[14] [CITE@en[HTML5 Revision Tracker]]
([TIME[2010-02-13 23:02:00 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4701&to=4702>


[20] [CITE[Document Object Model for MathML]]
( ([TIME[2001-02-20 21:36:10 +09:00]] 版))
<http://www.w3.org/TR/2001/REC-MathML2-20010221/appendixd.html#dom_NodeList>

[21] [CITE[Document Object Model for MathML]]
( ([TIME[2002-05-23 15:35:03 +09:00]] 版))
<http://www.w3.org/Math/DOM/mathml2/appendixd.html#dom_NodeList>

[22] [CITE[IRC logs: freenode / #whatwg / 20130603]]
( ([TIME[2013-06-04 23:41:06 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130603#l-769>

[23] [CITE[Add a warning note about ArrayClass. · 3c2a039 · whatwg/dom]] ([TIME[2013-06-06 13:26:29 +09:00]] 版) <https://github.com/whatwg/dom/commit/3c2a03960ba59e87b5d43cfeb997860b7aef8b98>

[24] [CITE[''''''[''''''whatwg'''''']'''''' Proposal: Adding methods like getElementById and getElementsByTagName to DocumentFragments]]
( ([TIME[2013-07-27 17:58:34 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-July/040244.html>

[26] [CITE@en[Fix #208: remove the Microdata API · whatwg/html@2aaecb8]] ([TIME[2015-10-07 20:10:57 +09:00]] 版) <https://github.com/whatwg/html/commit/2aaecb89900b875b9ee8357fa8bccf48477358bb>