* 仕様書

[REFS[

- [24] [CITE@en-US-x-hixie[HTML Standard]], [TIME[2023-12-24T10:13:23.000Z]], [TIME[2024-01-06T03:06:15.472Z]] <https://html.spec.whatwg.org/#serialising-html-fragments>

]REFS]

* 属性の順序

[21] [[要素]]の[[属性]]同士には[[順序]]がありますが、その[[順序]]は意味を持ちません。
これは少し複雑です。

[22] 
[[HTML文書]]や[[XML文書]]では[[開始タグ]]の[[属性指定並び]]で[[属性]]が何らかの順序で記述されます。
これは[[文字列]]である以上、避けられないことです。
このとき、記述の[[順序]]はありますが、その[[順序]]には意味がなく、
[[順序]]を変えても解釈が変わることは原則ありません。
例外として、同じ[[属性名]]の[[属性]]が複数あるときは、
最初のもの以外が無視されます。

[23] 
[[DOM]] では[[要素]]の[F[属性並び]]に[[属性]]が格納されますが、
[F[属性並び]]は[[並び]]です。[[並び]]には[[順序]]がありますが、
その[[順序]]には意味がなく、[[順序]]を変えても解釈が変わることは原則ありません。
例外として、同じ[[属性名]]の[[属性]]が複数あるときの挙動に影響します。
また、 [CODE[attributes]] [CODE[NamedNodeMap]] の[[列挙]]の[[順序]]となります。
[F[属性並び]]の変更が発生する処理は [CITE[DOM Standard]]
で定められていて、何もしていないのに勝手に[[順序]]が変わることはありません。

[25] 
[[HTMLの構文解析]]や[[XMLの構文解析]]では、
[[属性指定並び]]中の[[属性]]の順序が
[[DOM]]
の[F[属性並び]]中の[[属性]]の順序にどう反映されるか、
仕様上定められていません。
これは仕様策定当時の実装がばらばらだったことに起因します [SRC[>>7, >>5]]。

[26] 
[[HTMLの直列化]]や[[XMLの直列化]]では、
[[DOM]]
の[F[属性並び]]中の[[属性]]の順序が
[[HTML]] / [[XML]]
の[[属性指定並び]]中の[[属性]]の順序にどう反映されるか、
仕様上定めれていません。
ただし [[HTML]] では[[安定]]していることが要求され [SRC[>>24]]、
明文規定がないものの [[XML]] でも同様です。
ここでいう[[安定]]とは、例えば [CODE[innerHTML]]
[[取得器]]を連続して何度も実行したときに、
同じ順序で[[直列化]]されるということです。




-*-*-

[7] [[HTML文書]]中の[[属性]]の順序は、 
[[Firefox]] と [[IE7]] は逆ソース順、 [[Chrome]] はソース順となっています。 [TIME[2012-08-05T02:42:57.200Z]]


[27] 
[CODE[innerHTML]] の[[設定器]]で [[HTML]] を与え、
直後に [CODE[innerHTML]] の[[取得器]]で [[HTML]] を取得すると、
[[Chrome]] は試した限り確実に元の順序で[[属性]]が並んでいますが、
[[Firefox]] は元通りだったり変わっていたり法則性が掴めません。
[TIME[2024-01-06T03:16:40.800Z]]


[28] 
今となってはもうこんな非互換性を残しておく意味は皆無だし、
全部[[ソース順]] = [F[属性並び]]順になるよう整理してほしいもんだなあ。


[REFS[
- [5] [CITE[IRC logs: freenode / #whatwg / 20120519]]
( ([TIME[2012-06-01 20:32:08 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120519#l-449>
]REFS]

;; [6] >>5 [[DOM4]] では[[属性]]の順序が追加順と規定されている。

[13] [CODE(HTMLe)@en[[[object]]]] [[要素]][DEL[や [CODE(HTMLe)@en[[[applet]]]] [[要素]]]]が[[プラグイン]]に渡す順序は[[ソース順]]となっています
[SRC[>>3, >>14]]。

[REFS[
- [3] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#the-object-element>
- [14] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#the-applet-element>
]REFS]

* デモ

[1] [CODE(DOMa)@en[[[attributes]]]] 内の[[属性節点]]の順序

[REFS[
- [2] <http://suika.fam.cx/~wakaba/test/web/dom/attr/attrs-order-1.html>
]REFS]

* メモ

[REFS[
- [4] [CITE[IRC logs: freenode / #whatwg / 20100906]]
( ([TIME[2010-09-23 19:52:11 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20100906>
]REFS]



[8] [CITE@en[Bug 17176 – Element attributes should not be required to be stored in an ordered list, .innerHTML remains unspecified]]
( ([TIME[2013-01-02 09:02:58 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17176>

[9] [CITE@en[Bug 17871 – Element attributes should not be required to be stored in an ordered list]]
( ([TIME[2013-01-02 09:08:48 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17871>

[10] [CITE@en-US[XBL 2.0]]
( ([TIME[2012-05-03 02:23:03 +09:00]] 版))
<http://dev.w3.org/2006/xbl2/Overview.html#the-attributes-attribute>

[11] [CITE@en-US[XBL 2.0]]
( ([TIME[2012-05-03 02:23:03 +09:00]] 版))
<http://dev.w3.org/2006/xbl2/Overview.html#attribute-forwarding>

[12] [CITE@en[Bug 21986 – Element.attributes needs to have a named getter]]
( ([TIME[2013-05-30 03:41:28 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=21986>

[15] [CITE@en[13913 – Attributes don't have an order]]
([TIME[2016-04-14 11:40:57 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=13913>

[16] [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>

[17] [CITE@en[Remove <applet>]]
([[zcorpan]]著, [TIME[2017-08-21 22:19:30 +09:00]])
<https://github.com/whatwg/html/commit/b9b9d60f9451c05f8e8d542e4094f987ae1a5fb8>

[18] [CITE@en[Make attribute order not matter for <progress>]]
([[annevk]]著, [TIME[2017-09-25 23:19:02 +09:00]])
<https://github.com/whatwg/html/commit/6bf4f3cf2fbfb265fcd9f079a371a7cc68d4fe62>

[19] [CITE@en[Spec for `progress` element either specifies attribute order dependency or can be easily misread that way · Issue #3066 · whatwg/html]]
([TIME[2017-10-04 17:25:39 +09:00]])
<https://github.com/whatwg/html/issues/3066>

[20] [CITE@en[Make attribute order not matter for <progress> by annevk · Pull Request #3067 · whatwg/html]]
([TIME[2017-10-04 17:28:32 +09:00]])
<https://github.com/whatwg/html/pull/3067>