[7] [DFN[[CODE(DOMi)@en[[[NodeIterator]]]]]] [[オブジェクト]]は、
[[DOM木]]上の[[節点]]を[[木順]]または[[逆木順]]に[[探索]]する[[イテレーター]]です。

* 仕様書

[REFS[
- [6] [CITE@en-US[DOM Standard]] ([TIME[2014-06-23 14:49:32 +09:00]] 版) <http://dom.spec.whatwg.org/#nodeiterator>
]REFS]

* 文脈

[16] [CODE(DOMi)@en[[[NodeIterator]]]] は[[文書環境]]に(のみ)[[晒され]]ます。

[20] [CODE(DOMi)@en[[[NodeIterator]]]] は [CODE(DOMm)@en[[[createNodeIterator]]]]
[[メソッド]]により作成することができます。[[コンストラクター]]から作成することはできません。

* 状態

[13] [CODE(DOMi)@en[[[NodeIterator]]]] [[オブジェクト]]は次の状態を持ちます。

[FIG(list middle members)[ [CODE[NodeIterator]] の状態
: [[根]] :
: [[イテレーターコレクション]] : >>8
: [[whatToShow]] :
: [[フィルター]] :
: [[参照節点]] :
: [CODE(DOMa)@en[[[pointerBeforeReferenceNode]]]] :
: [F[活性フラグ]] :
]FIG]

;; [14] [[根]]、[[whatToShow]]、[[フィルター]]、
[[イテレーターコレクション]]自身は[[オブジェクト]]の作成の時点で決定され、
変化しません。それ以外のものや、[[イテレーターコレクション]]が表すものは変化することがあります。

* メンバー

[15] [CODE(DOMi)@en[[[NodeIterator]]]] [[オブジェクト]]は次の[[メソッド]]と[[IDL属性]]を持ちます
[SRC[>>6]]。
[FIG(list short)[
- [CODE(DOMm)@en[[[detach]]]]
- [CODE(DOMa)@en[[[filter]]]]
- [CODE(DOMm)@en[[[nextNode]]]]
- [CODE(DOMa)@en[[[pointerBeforeReferenceNode]]]]
- [CODE(DOMm)@en[[[previousNode]]]]
- [CODE(DOMa)@en[[[referenceNode]]]]
- [CODE(DOMa)@en[[[root]]]]
- [CODE(DOMa)@en[[[whatToShow]]]]
]FIG]

* イテレーターコレクション

[8] [CODE(DOMi)@en[[[NodeIterator]]]] の動作は、
仕様書上[DFN[[RUBYB[[[イテレーターコレクション]]]@en[iterator collection]]]]
[SRC[>>6]] によって説明されています。必ずしもこの通りに実装しなければならないわけではありませんが、
[[スクリプト]]から区別できない同等な動作を実装しなければなりません。

[9] [[イテレーターコレクション]]は、 [CODE(DOMi)@en[[[NodeIterator]]]]
の[[根]]を[[根]]とし、すべての[[節点]]と[[一致]]する[[フィルター]]を持つ[[コレクション]]です
[SRC[>>6]]。この[[コレクション]]は [[live]] です。[[コレクション]]内の[[節点]]は[[木順]]で[[整列]]しています。

[FIG(corollary)[
[18] [[イテレーターコレクション]]の[[フィルター]]は、[CODE(DOMi)@en[[[NodeIterator]]]]
の[[フィルター]]とは異なります。
]FIG]

[FIG(corollary)[
[19] 他の多くの[[コレクション]]とは違って、[[要素]]以外の[[節点]]が含まれることもあります。
]FIG]

[FIG(corollary)[
[17] [[根]]も[[コレクション]]内に含まれます。
]FIG]

[10] [CODE(DOMm)@en[[[previousNode]]]], [CODE(DOMm)@en[[[nextNode]]]]
両[[メソッド]]は、[[イテレーターコレクション]]上で[[参照節点]]の前後にある[[節点]]へと[[参照節点]]を移動し、
新しい[[参照節点]]を返す[[メソッド]]と説明されています。

;; この時には [CODE(DOMi)@en[[[NodeIterator]]]] の[[フィルター]]と
[CODE(DOMa)@en[[[whatToShow]]]] が適用されるので、
[[イテレーターコレクション]]上の2つ以上前後の[[節点]]に移動するかもしれません。

[11] [[参照節点]]が削除されて[[根]]の[[部分木]]からなくなった場合には、
[[イテレーターコレクション]]上の前後 ([CODE(DOMa)@en[[[pointerBeforeReferenceNode]]]]
が[[真]]なら前、[[偽]]なら後) の[[節点]]へと[[参照節点]]が移動します。

[FIG(corollary)[
[12] [[イテレーターコレクション]]は [[live]] ですから、 [[DOM木]]の変更が即座に反映されます。
従って、[[DOM木]]からの削除は即座に[[参照節点]]を変更させることとなります。
]FIG]

[FIG(corollary)[
[21] [CODE(DOMi)@en[[[NodeIterator]]]] は、[[根]]が属する[[文書]]に所属するものと考えることもできます。
その場合、[[根]]が [[adopt]] されて所属する[[文書]]が変わることがあります。
]FIG]

* 歴史

[5] [CITE[Index of /tests/adhoc/dom/traversal/node-iterator]]
( ([TIME[2014-07-23 09:08:25 +09:00]] 版))
<http://hixie.ch/tests/adhoc/dom/traversal/node-iterator/>

[FIG(quote)[
[FIGCAPTION[
[1] [CITE@en-us[Firefox 3.1 for developers - MDC]] ([TIME[2009-02-08 18:25:06 +09:00]] 版) <https://developer.mozilla.org/ja/Firefox_3.1_for_developers#.E6.96.B0.E3.81.97.E3.81.8F.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88.E3.81.95.E3.82.8C.E3.81.9F.E6.A9.9F.E8.83.BD_2>
]FIGCAPTION]

>NodeIterator オブジェクト API
]FIG]

[4] [CITE[Bug 3492 – TreeWalker implementation needs to be fixed (affects Acid3)]]
( ([TIME[2014-07-23 09:08:04 +09:00]] 版))
<https://bugs.webkit.org/show_bug.cgi?id=3492>

* メモ

[2] [CITE[Introduction to DOM Traversal - DOM ECMAScripting]]
( ([TIME[2012-02-19 11:54:27 +09:00]] 版))
<http://domes.lingua.heliohost.org/dom/intro-traversal1.html>

[3] [[NodeIterator]] って誰が使ってるんだろう???? ぐぐってもでてくるのは [[javadoc]]
ばかりだし・・・。 [TIME[2014-07-23T09:05:34.800Z]]

[22] [CITE@en[Fix NodeIterator removing step · whatwg/dom@c97daed]] ([TIME[2015-05-30 23:58:41 +09:00]] 版) <https://github.com/whatwg/dom/commit/c97daedbe0da3b4e59d103226af74bb5a4231460>

[23] [CITE@en[Fix NodeIterator removing step. Closes #27 · whatwg/dom@248d4fe]] ([TIME[2015-05-30 23:59:10 +09:00]] 版) <https://github.com/whatwg/dom/commit/248d4fe2732ef4e37b186127948c0c50b2c9259b>

[24] [CITE@en[Editorial: flip non-null/otherwise conditions · whatwg/dom@8d281a3]]
([TIME[2016-04-22 18:21:58 +09:00]] 版)
<https://github.com/whatwg/dom/commit/8d281a354690abfda5ff558c461747f304f11788>

[25] ある部分木の[[節点]]を順番に[[訪問]]して、[[テキスト]]を拾いつつ特定の[[要素]]の前後に区切り文字を入れたものを得たい、
みたいなありがちなシチュエーションで、
使えそうで使えないんですよねぇ... ([[親]] → [[子]]の順またはその逆順のどちらかなので、
子孫の後に区切りを挟む、というのができない。)

[26] [CITE@en[Reinstate active flag for iterators]]
([[ayg]]著, [TIME[2017-08-08 16:07:39 +09:00]])
<https://github.com/whatwg/dom/commit/6a796cc7676263c30550abfd7cc248300d006b2d>

[27] [CITE@en[Also unset the active flag when an exception is thrown]]
([[annevk]]著, [TIME[2017-08-25 00:17:53 +09:00]])
<https://github.com/whatwg/dom/commit/48c4b4aa0d1b4044b7be62d3a75aaab94058161f>

[28] [CITE@en[Editorial: fix several issues with traversal]]
([[annevk]]著, [TIME[2018-03-13 19:19:38 +09:00]])
<https://github.com/whatwg/dom/commit/a6d17ae5e762d5261a9ca2e6e742cb792fa06e09>

[29] [CITE@en[Editorial: fix several issues with traversal by annevk · Pull Request #594 · whatwg/dom]]
([TIME[2018-03-17 18:05:42 +09:00]])
<https://github.com/whatwg/dom/pull/594>

[30] [CITE@en[NodeIterator's pre-removing steps need to account for node being root]]
([[annevk]]著, [TIME[2018-04-10 17:07:37 +09:00]])
<https://github.com/whatwg/dom/commit/c80e0176d9565d2832ae3d535414faff7f6e7dda>

[31] [CITE@en[NodeIterator pre-removing steps seem incorrect · Issue #496 · whatwg/dom]]
([TIME[2018-04-11 12:13:42 +09:00]])
<https://github.com/whatwg/dom/issues/496>

[32] [CITE@en[NodeIterator's pre-removing steps need to account for node being root by annevk · Pull Request #615 · whatwg/dom]]
([TIME[2018-04-11 12:14:17 +09:00]])
<https://github.com/whatwg/dom/pull/615>