

[1] [[DOM]] の界面 [CODE(DOMi)[NamedNodeMap]]
は、名前で識別される節 ([CODE(DOM)[[[Node]]]])
の集まりです。

[2] [CODE(DOM)[[[NodeList]]]] と異なり、
集まりの要素である各 [CODE(DOM)[Node]]
はそれぞれ異なる「名前」を持ちます。また、各 [CODE(DOM)[Node]]
の順序は必ずしも保存されません。
([CODE(DOMm)[item]] method で索引番号を指定できますが、
内容の列挙のための便宜上のものだそうです。
[WEAK[(ということは、 [WEAK[(DOM 1 には何も書かれていませんが、)]] [CODE[foreach my [VAR[$i]] (0〜[VAR[$NamedNodeMap]].[CODE(DOMa)[length]]−1) { [CODE(object)[debug]].[CODE(method)[print]] "[VAR[${i}]]th item:" + [VAR[$NamedNodeMap]].[CODE(DOMm)[item]] ([VAR[$i]]) }]] が期待通りに動作する [WEAK[(全項目を1回ずつ出力する。)]] ことくらいは期待してよいのかな? [WEAK[(本当に全く順序が保証されないのなら、 loop 内で何もしなくても、 [VAR[$i]] 番目の項目がどれかが勝手に変わっていく虞がある。)]])]]

[3]
,method	,[CODE(DOMm)[[[getNamedItem]]]]	,名前付き項目取得	,[DOM1]
,method	,[CODE(DOMm)[[[getNamedItemNS]]]]	,名前付き項目取得	,[DOM2]
,method	,[CODE(DOMm)[[[setNamedItem]]]]	,名前付き項目設定	,[DOM1]
,method	,[CODE(DOMm)[[[setNamedItemNS]]]]	,名前付き項目設定	,[DOM2]
,method	,[CODE(DOMm)[[[removeNamedItem]]]]	,名前付き項目削除	,[DOM1]
,method	,[CODE(DOMm)[[[removeNamedItemNS]]]]	,名前付き項目削除	,[DOM2]
,[CODE(DOMm)@en[[[item]]]]	,"[CODE(DOMi)@en[[[HTMLAttributeCollection]]]] ([[WinIE 4]]), [CODE(DOMi)@en[[[NamedNodeMap]]]] ([[DOM水準1中核]])"
,[CODE(DOMa)@en[[[length]]]]	,"[CODE(DOMi)@en[[[HTMLAttributeCollection]]]] ([[WinIE 4]]), [CODE(DOMi)@en[[[NamedNodeMap]]]] ([[DOM水準1中核]])"

[4] [[perl]] などで実装するなら[[連想配列]]にするのがよさげです。

- [DOM1] ''Document Object Model (Core) Level 1'' <http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1780488922>
- [DOM2] ''Document Object Model Core'' <http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1780488922>
- [5] >>4 でも module を [[bless]] してうまくまとめないと DOM 非適合になりそうな罠。うまくやっとくれよ。

[6]
[[DOM水準2]]と[[DOM水準3]]によると、
同じ [CODE(DOMa)@en[[[nodeName]]]] で異なる
[CODE(DOMa)@en[[[namespaceURI]]]] の
[CODE(DOMi)@en[[[Attr]]]] [[節点]]が複数1つの
[CODE(DOMi)@en[[[NamedNodeMap]]]]
に含まれる可能性があります。その場合、
[[DOM水準1]]の[[メソッド]]でどれが返されるかは[[実装依存]]です。ですが、常に同じものが返されなければなりません。

* 利用箇所

[7] [CODE(DOMi)@en[[[NamedNodeMap]]]] は次の箇所で使われています。
[FIG(list)[
- [CODE(DOMi)@en[[[Node]]]]
-- [CODE(DOMa)@en[[[attributes]]]]
- [CODE(DOMi)@en[[[DocumentType]]]]
-- [CODE(DOMa)@en[[[entities]]]]
-- [CODE(DOMa)@en[[[notations]]]]
-- [CODE(DOMa)@en[[[elementTypes]]]]
- [CODE(DOMi)@en[[[ElementTypeDefinition]]]]
-- [CODE(DOMa)@en[[[attributeDefinitions]]]]
]FIG]

;; [10] [CODE(DOMa)@en[[[attributes]]]] 以外は非標準です。 [CODE(DOMa)@en[[[attributes]]]]
は [[AttrExodus]] によって [CODE(DOMi)@en[[[Node]]]] から [CODE(DOMi)@en[[[Element]]]]
に移動され、[[型]]も [CODE(DOMi)@en[[[NamedNodeMap]]]] ではなく
[CODE(DOMi)@en[[[Attr]] [] ]] ([[read only array]]) に変更されています。

* 名前付き特性

[8] [[DOM3]] では[[索引付き特性]]にしか言及がありませんが、実際には[[名前付き特性]]によってもアクセスできるようです。

[9] [[Chrome]] で実装されていました。 [TIME[2013-01-03T05:55:41.200Z]]

[11] [CITE@en[Not worth it to rename NamedNodeMap · 64a93e8 · whatwg/dom]]
( ([TIME[2014-08-21 11:08:42 +09:00]] 版))
<https://github.com/whatwg/dom/commit/64a93e85fa7a7284b068d1926eaeb3a0f9fd16d9>

[12] [CITE@en[Introduce NamedNodeMap for attributes. Clean up algorithms around attrib... · 8af4826 · whatwg/dom]]
( ([TIME[2014-08-21 13:26:13 +09:00]] 版))
<https://github.com/whatwg/dom/commit/8af48267390b971a2ac02c7005ba42c08264b7e1>

[13] [CITE@en[Fix #141: NamedNodeMap's supported property names should not contain … · whatwg/dom@5dbefd1]]
([TIME[2016-01-07 11:55:22 +09:00]] 版)
<https://github.com/whatwg/dom/commit/5dbefd1035c5528e236a8b13dabcbd6c649e2d3e>

[14] [CITE@en[Fix #141 (again): omit non-lowercase property names from NamedNodeMap… · whatwg/dom@8898ac5]]
([TIME[2016-01-08 16:23:40 +09:00]] 版)
<https://github.com/whatwg/dom/commit/8898ac57e5d9ea9b5592f5e61d42fc5e420c870b>

[15] [CITE@en[Fix #141 (again): omit non-lowercase property names from NamedNodeMap… · whatwg/dom@8898ac5]]
([TIME[2016-01-30 21:13:10 +09:00]] 版)
<https://github.com/whatwg/dom/commit/8898ac57e5d9ea9b5592f5e61d42fc5e420c870b>

[16] [CITE@en[Add ''''''[''''''CEReactions'''''']'''''' annotations to mutating methods · whatwg/dom@3cd02d1]]
([TIME[2016-04-26 19:08:59 +09:00]] 版)
<https://github.com/whatwg/dom/commit/3cd02d139c159a31fbb400e03932652c72fc7812>

[17] [CITE@en[Editorial: define attribute list in terms of Infra's list]]
([[annevk]]著, [TIME[2017-04-07 17:48:53 +09:00]])
<https://github.com/whatwg/dom/commit/f88c7a087268f5a9cf55b92c40754107e696d705>