[1] [DFN[[RUBYB[[[フォーム被関連付け要素]]]@en[form-associated element]]]]は、[[フォーム所有子]]を持つことができる[[要素]]です
[SRC[>>3]]。[[フォーム被関連付け要素]]は [CODE(HTMLe)@en[[[form]]]] [[要素]]と関係を持つことができ、
これを[[要素]]の[DFN[[RUBYB[[[フォーム所有子]]]@en[form owner]]]]といいます [SRC[>>24]]。

[71] [[フォーム所有子]]は[[木構造]]に基づき自動的に決まりますが、 [CODE(HTMLa)@en[[[form]]]]
[[内容属性]]によって[[著者]]が上書きすることもできます。どの[[要素]]が[[フォーム所有子]]であるかは
[CODE(DOMa)@en[[[form]]]] [[IDL属性]]によって取得できます。

* 仕様書

[REFS[
- [2] [[HTML Standard]]
-- [3] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#form-associated-element>'''
--- [[フォーム被関連付け要素]]
-- [24] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#association-of-controls-and-forms>'''
--- [[フォーム所有者]]
-- [94] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-05-16 15:40:32 +09:00]]) <https://html.spec.whatwg.org/#create-an-element-for-the-token>
]REFS]

* 分類

[124] [[フォーム被関連付け可能要素]]には次のような小分類があります。

[FIG[
- [17] [[フォーム被関連付け要素]]
-- [123] [DEL[[[再関連付け可能要素]]]]
-- [18] [[被列挙要素]]
-- [19] [[ラベル付け可能要素]]
-- [20] [[提出可能要素]]
--- [22] [[ボタン]]
---- [23] [[提出ボタン]]
-- [21] [[再設定可能要素]]
]FIG]

[138] ただし[[ラベル付け可能要素]]には、[[フォーム被関連付け可能要素]]でないものも含まれています。

** フォーム被関連付け要素の一覧

[FIG(short list)[
- [4] [CODE(HTMLe)@en[[[button]]]]
- [5] [CODE(HTMLe)@en[[[fieldset]]]]
- [122] [CODE(HTMLe)@en[[[img]]]]
- [6] [CODE(HTMLe)@en[[[input]]]]
- [7] [CODE(HTMLe)@en[[[keygen]]]]
- [10] [CODE(HTMLe)@en[[[object]]]]
- [11] [CODE(HTMLe)@en[[[output]]]]
- [13] [CODE(HTMLe)@en[[[select]]]]
- [14] [CODE(HTMLe)@en[[[textarea]]]]
]FIG]

[15] [CODE(HTMLe)@en[[[option]]]], [CODE(HTMLe)@en[[[optgroup]]]], [CODE(HTMLe)@en[[[legend]]]],
[CODE(HTMLe)@en[[[datalist]]]] は含まれていません。

[132] [CODE(HTMLe)@en[[[object]]]] は理論上は[[フォーム制御子]]として使えるため、ここに含まれています。

[133] [CODE(HTMLe)@en[[[img]]]] は歴史的経緯から [CODE(JS)@en[document.forms[n].imgname]] のようにアクセスできるため、
内部的に[[フォーム]]との関連付けを保持しており、ここに含まれています。

[HISTORY[
[137] [CODE(HTMLe)@en[[[meter]]]] と [CODE(HTMLe)@en[[[progress]]]] は >>136
により一時的に含まれていました。

[8] かつては [CODE(HTMLe)@en[label]] も含まれていました。
]HISTORY]

;; [139] これらはいずれも[[字句内容]]、[[フロー内容]]として使うことができる[[要素]]です。

** 再関連付け可能要素

[HISTORY[
[125] [DFN[[RUBYB[[[再関連付け可能要素]]]@en[reassociateable element]]]]は、
[CODE(HTMLa)@en[[[form]]]] [[内容属性]]、[CODE(DOMa)@en[[[form]]]] [[IDL属性]]を有する[[フォーム所有子]]を指定可能な[[フォーム被関連付け要素]]です。

[FIG(short list)[
- [CODE(HTMLe)@en[[[button]]]]
- [CODE(HTMLe)@en[[[fieldset]]]]
- [CODE(HTMLe)@en[[[input]]]]
- [CODE(HTMLe)@en[[[keygen]]]]
- [CODE(HTMLe)@en[[[label]]]]
- [CODE(HTMLe)@en[[[object]]]]
- [CODE(HTMLe)@en[[[output]]]]
- [CODE(HTMLe)@en[[[select]]]]
- [CODE(HTMLe)@en[[[textarea]]]]
]FIG]

[9] [CODE(HTMLe)@en[label]] から [CODE(HTMLa)@en[form][form=""]]
[[内容属性]]が削除されたことで、[[被列挙要素]]と同じとなり、廃止されました。
]HISTORY]

** 一覧

[127] 各分類に属する[[要素]]の一覧は >>126 にあります。

[REFS[
- [126] [CITE[data-web-defs/data/elements.json at master · manakai/data-web-defs]] ([TIME[2014-04-06 02:53:24 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/data/elements.json>
]REFS]

* 状態

[64] [[フォーム被関連付け要素]]は、次の状態を持ちます。
[FIG(list members)[
: [F[フォーム所有子]] : >>72
: [F[構文解析器挿入フラグ]] : [[構文解析器]]による[[挿入][要素の挿入]]かどうかを表します。
[[フォーム所有子の再設定]]に関わります。
]FIG]

* フォーム所有子

[72] [[フォーム被関連付け要素]]は、[DFN[[F[[RUBYB[[[フォーム所有子]]]@en[form owner]]]]]]を持ちます。
[F[フォーム所有子]]は、 [CODE(HTMLe)@en[form]] [[要素]]または [[null]] です [SRC[>>24]]。

[65] [[フォーム所有子]]は、原則として次のように決まります。
[FIG(switch)[
: [[影を含む文書中]]にない : [[null]]
: [CODE(HTMLa)@en[form][form=""]] [[属性]]がある :
参照されている [CODE(HTMLe)@en[form]] [[要素]]
: [CODE(HTMLe)@en[form]] [[要素]]が[[祖先]]にある :
[[祖先]]の [CODE(HTMLe)@en[form]] [[要素]]
: それ以外 : [[null]]
]FIG]

** フォーム所有子の変化

[108] [[フォーム所有者]]は次の場合に変化します。

[FIG(list)[
- [80] [[フォーム被関連付け要素]]が作られた時点では[[フォーム所有者]]は [[null]] でなければ[['''なりません''']] [SRC[>>24]]。
- [81] [[フォーム被関連付け要素]]が[[フォーム]]に[DFN[[RUBYB[関連付けられる]@en[associated]]]] ([DFN[[RUBYB[フォーム関連付け]@en[form association]]]]) と、[[フォーム所有者]]はその[[フォーム]]に設定されなければ[['''なりません''']] [SRC[>>24]]。
- [82] [[フォーム被関連付け要素]][VAR[要素]]の[[挿入手順群]]は、次のようにしなければ[MUST[なりません]] 
[SRC[>>24]]。
[FIG(steps)[
= [75] [VAR[要素]]の[F[構文解析器挿入フラグ]]が[[偽]]の場合、
== [87] [VAR[要素]]について[[フォーム所有子の再設定]]を実行します。
]FIG]
- [120] [[フォーム被関連付け要素]][VAR[要素]]の[[削除手順群]]は、次のようにしなければ[MUST[なりません]]
[SRC[>>24]]。
[FIG(steps)[
= [88] [VAR[要素]]の[F[フォーム所有子]]が [CODE[null]] で''なく''、
[VAR[要素]]の[F[木]]と[VAR[要素]]の[F[フォーム所有子]]の[F[木]]が等しく''ない''場合、
== [89] [VAR[要素]]について[[フォーム所有子の再設定]]を実行します。
]FIG]
- [84] [[フォーム被関連付け要素]][VAR[要素]]の [CODE(HTMLa)@en[[[form]]]] [[内容属性]]が追加・変更・削除された時は、
[VAR[要素]]の[F[構文解析器挿入フラグ]]を、[[偽]]に設定し、
[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。
- [83] [[フォーム被関連付け要素]]が [CODE(HTMLa)@en[[[form]]]] [[内容属性]]を持つ場合、
[[木]]内の[[要素]]の [[ID]] が変化したり、[[ID]] を持った[[要素]]が[[文書に挿入]]か[[文書から削除]]されたりしたら、
[[フォーム所有者を再設定]]しなければ[MUST[なりません]] [SRC[>>24]]。
]FIG]

;; [28] [[フォーム]]との関連付け自体は[[影木]]にも適用されますが、
[CODE(HTMLa)@en[form][form=""]] [[属性]]による関連付けは同じ[[木]]でなければなりません。

;; [95] [[構文解析器]]によって[[フォーム被関連付け要素]]が[[作成][字句の要素の作成]]され、
[[挿入][節点の挿入]]される場合、[[作成][字句の要素の作成]]時点で[[フォーム関連付け]]が行われ、
[[挿入][節点の挿入]]時の通常の[[フォーム所有者の再設定]]は行われません [SRC[>>94]]。
[[構文解析器挿入フラグ]]はこの挙動の管理に使われています。

** フォーム所有者の再設定

[85] [[フォーム被関連付け要素]][VAR[要素]]の[DFN[[RUBYB[フォーム所有者の再設定]@en[reset the form owner]]]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>24]]。

[FIG(steps)[
= [66] 
[FIG(list)[
- [30] [VAR[要素]]の[F[フォーム所有者]]が [[null]] では''ない''
- [31] [VAR[要素]]が[[被列挙要素]]では''ない''か、
[VAR[要素]]の [CODE(HTMLa)@en[form][form=""]] [[属性]]がない
- [32] [VAR[要素]]の[F[フォーム所有者]]が[VAR[要素]]の直近の[[祖先]]
[CODE(HTMLe)@en[form]] [[要素]]である
]FIG]
... の''すべて''を満たすなら、
== [33] ここで停止します。
= [35] [VAR[要素]]の[F[フォーム所有者]]を、 [[null]] に設定します。
= [34] 
[FIG(list)[
- [36] [VAR[要素]]が[[被列挙要素]]である
- [37] [VAR[要素]]が [CODE(HTMLa)@en[form][form=""]] [[属性]]を持つ
- [38] [VAR[要素]]が[[影を含む文書中]]にある
]FIG]
... の''すべて''を満たすなら、
== [39] [VAR[フォーム]]を、
[FIG(list)[
- [45] [VAR[要素]]の[F[木]]にある
- [56] [F[識別子]]がある
- [57] [F[識別子]]が[VAR[要素]]の [CODE(HTMLa)@en[form][form=""]] [[属性値]]と等しい
]FIG]
... の''すべて''を満たす、[[木順]]で最初の[[要素]]に設定します。
== [58] [VAR[フォーム]]が [CODE(HTMLe)@en[form]] [[要素]]なら、
=== [59] [VAR[要素]]と[VAR[フォーム]]を[[フォーム関連付け]]します。
= [60] それ以外で、[VAR[要素]]の[[祖先]]に [CODE(HTMLe)@en[form]] [[要素]]があれば、
== [63] [VAR[フォーム]]を、[VAR[要素]]の[[祖先]]で直近の
[CODE(HTMLe)@en[form]] [[要素]]に設定します。
== [62] [VAR[要素]]と[VAR[フォーム]]を[[フォーム関連付け]]します。
]FIG]

** 例

[EG[
[93] 
[PRE(HTML bad example code)[
...
 <form id="a">
  <div id="b"></div>
 </form>
 <script>
  document.getElementById('b').innerHTML =
     '<table><tr><td><form id="c"><input id="d"></table>' +
     '<input id="e">';
 </script>
...
]PRE]

[CODE(HTML)@en[e]] [[要素]]の[[フォーム所有子]]は [CODE(HTML)@en[c]] ではなく
[CODE(HTML)@en[a]] になります [SRC[>>24]]。

[CODE(HTMLa)@en[[[innerHTML]]]] が内部的に[[HTML構文解析器]]で解釈を終えた時点では、確かに
[CODE(HTML)@en[e]] の[[フォーム所有者]]は [CODE(HTML)@en[c]] です ([CODE(HTML)@en[[[form]]]]
[[要素]]が閉じられていませんから)。ところが [CODE(HTML)@en[e]] [[要素]]が [CODE(HTML)@en[b]]
[[要素]]の[[子供]]となった瞬間に、[[フォーム所有者の再設定]]が起こり、
[CODE(HTML)@en[a]] に選び直されます。
]EG]

* form 要素指示子

[96] [[HTML構文解析器]]の [DFN[[CODE(HTMLe)@en[form]] [RUBYB[要素指示子]@en[element pointer]]]]は、
最後に開かれて閉じていない [CODE(HTMLe)@en[[[form]]]] [[要素]]を指すものです
[SRC[>>98]]。

** 仕様書

[REFS[
- [97] [[HTML Standard]]
-- [98] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#form-element-pointer>'''
-- [100] <http://www.whatwg.org/specs/web-apps/current-work/complete.html#insert-an-html-element>
-- [101] <http://www.whatwg.org/specs/web-apps/current-work/complete.html#parsing-html-fragments>
]REFS]

** 省略可能性

[147] [[[CODE(HTMLe)@en[form]]要素指示子]]は、[[スクリプト無効]]な[[構文解析器]]でも実装する必要があります。
(値によって[[構文解析]]の結果が変化します。) しかし[[フォーム所有者の再設定]]の呼び出しは、
[[スクリプト]]と[[フォーム]]を実装していないなら、省略できます。

** 値の変化

[FIG(list)[
- [99] 初期状態では値は [[null]] です [SRC[>>98]]。
- [102] [[HTML構文解析器]]によって [CODE(HTMLe)@en[[[form]]]] [[要素]]が作られるときに、その[[要素]]に設定されます。
- [103] [[HTML構文解析器]]によって [CODE(HTMLe)@en[[[form]]]] [[要素]]が閉じられるときに、 [[null]] に設定されます。
- [104] [[HTML素片構文解析算法]]において、文脈[[要素]]を含む[[祖先]]のいずれかが [CODE(HTMLe)@en[[[form]]]] [[要素]]なら、[[直近祖先]]たる [CODE(HTMLe)@en[[[form]]]] [[要素]]に設定されます
[SRC[>>101]]。
]FIG]

[105] つまり、[[開始タグ]]があって[[終了タグ]]が(まだ)ない最後の [CODE(HTMLe)@en[[[form]]]] 
[[要素]]を指している状態になっています。

[141] [CODE(HTMLe)@en[[[form]]]] [[終了タグ]]は、たとえそれによって閉じられる
[CODE(HTMLe)@en[[[form]]]] [[要素]]が存在していなくても、
[[[CODE(HTMLe)@en[form]]要素指示子]]を [[null]] に設定する効果があります。
[CODE(HTMLe)@en[[[table]]]] などをトリッキーに使って、あるいは[[素片構文解析]]によってそのような状況が生じることがあります。

[142] ただし、[[素片構文解析]]の場合は、一時的に架空の[[木]]において[[構文解析]]を行った後、
得られた[[節点]]が指定された位置に挿入される、という形を取っており、
最終的な挿入は[[構文解析器]]による挿入ではありませんから、
たとえ[[[CODE(HTMLe)@en[form]]要素指示子]]により特別な[[フォーム所有者]]の関連付けが行われていたとしても、
再設定により失われてしまいます。

[EG[
[143] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cform%20id%3Da%3E%0A%3Cscript%3E%0A%20%20document.forms%5B0%5D.innerHTML%20%3D%20%27%3C%2Fform%3E%3Ctable%3E%3Cform%20id%3Db%3E%3Ctr%3E%3Ctd%3E%3Cinput%3E%27%3B%0A%20%20w%20(document.getElementsByTagName%20(%27input%27)%5B0%5D.form.id)%3B%0A%3C%2Fscript%3E>
の例では、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の [CODE(DOMa)@en[[[innerHTML]]]]
を設定しています。その場合[[[CODE(HTMLe)@en[form]]要素指示子]]が設定されてから[[構文解析]]がはじまるので、
[CODE(HTMLe)@en[[[form]]]] [[開始タグ]]は無視されます。ところが本例では
[CODE(HTMLe)@en[[[form]]]] [[終了タグ]]によって[[[CODE(HTMLe)@en[form]]要素指示子]]が
[[null]] に設定されるため、 [CODE(HTMLe)@en[[[form]]]] [[開始タグ]]は無視されず、
[CODE(HTMLe)@en[[[form]]]] [[要素]]が作られます。

[144] ただし [CODE(HTMLe)@en[[[form]]]] [[要素]]は[[里親付け]]により [CODE(HTMLe)@en[[[table]]]]
[[要素]]の[[兄]]となり、 [CODE(HTMLe)@en[[[td]]]] [[要素]]内の
[CODE(HTMLe)@en[[[input]]]] [[要素]]はその [CODE(HTMLe)@en[[[form]]]] [[要素]]の[[子孫]]とはなりません。
それでも[[[CODE(HTMLe)@en[form]]要素指示子]]によって両者は一旦関連付けられるのですが、
[[素片構文解析]]の全体が完了した後、得られた[[要素]]が1つ目の [CODE(HTMLe)@en[[[form]]]]
[[要素]]の[[子供]]として挿入され、[[フォーム所有者の再設定]]が実行されます。
この時に[[木構造]]に従い[[フォーム所有者]]が決定されるので、
[CODE(HTMLe)@en[[[input]]]] [[要素]]の[[フォーム所有者]]は変更されるのです。
]EG]

[145] なお、先祖に [CODE(HTMLe)@en[[[form]]]] [[要素]]が存在するケースの[[素片構文解析]]では、
[[[CODE(HTMLe)@en[form]]要素指示子]]が[[構文解析]]中に変更されない場合、
[[構文解析]]の時点では[[フォーム所有者]]は設定されず、
最後の挿入の時点で[[木構造]]に従い[[フォーム所有者]]が決まることになります。

;; [[フォーム所有者]]と[[構文解析]]によって作成された[[要素]]が同じ[[家部分木]]に属さないからです。
[[字句から要素の作成]]の項を参照。

** 構文解析への影響

[106] [[[CODE(HTMLe)@en[form]]要素指示子]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]を指している間は
[[HTML構文解析器]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]を新たに作ることはありません。
つまり、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の入れ子状態を [[HTML構文解析器]]自身が作り出すことはありません。

[119] [CODE(HTMLe)@en[[[template]]]] [[要素]]内では[[[CODE(HTMLe)@en[form]]要素指示子]]は無視され、
[[フォーム制御子]]と[[フォーム]]の関連付けは行われません。

[146] [[構文解析器]]が [[AAA]] によって[[要素]]を移動した場合、
[[構文解析器]]による[[挿入]]としてではなく、
通常の [[insert]] として処理されるため、
結果的に[[[CODE(HTMLe)@en[form]]要素指示子]]は無視されます。

;; <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Ctable%3E%3Cform%3E%3Ctd%3E%3Cb%3E%3Cp%3E%3Cinput%3E%3C%2Fb%3E%3Cscript%3Ew(document.querySelector(%27input%27).form)%3C%2Fscript%3E>

** 関連

[107] [[[CODE(HTMLe)@en[form]]要素指示子]]は、[[HTML構文解析器]]によって[[フォーム被関連付け要素]]が[[文書]]に挿入される時点で[[フォーム所有者]]の決定に使われます
(>>95)。

[109] [[フォーム所有者の再設定]]が起こる (>>108) と
[[[CODE(HTMLe)@en[form]]要素指示子]]の影響で生じた[[フォーム]]との関連付けは解消されます。
従って[[[CODE(HTMLe)@en[form]]要素指示子]]の影響は[[構文解析]]の直後に限定されます
[WEAK[(といっても[[構文解析]]は [CODE(DOMa)@en[[[innerHTML]]]] などでいつでも発生し得ます)]]。
[[[CODE(HTMLe)@en[form]]要素指示子]]がなかった場合との違いが生じるのは、
[CODE(HTMLe)@en[[[form]]]] [[要素]]が[[終了タグ]]無しで閉じられた後に続く[[フォーム制御子]]が、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の[[子孫]]でもないのに関連付けられる場合だけです。

;; [110] [[HTML素片構文解析算法]]の中で [CODE(HTMLe)@en[[[form]]]] [[要素]]が閉じられると、
その[[文脈節点]]の[[先祖]]である [CODE(HTMLe)@en[[[form]]]] [[要素]]の[[子孫]]であるにも関わらず関連付けられる[[フォーム制御子]]が発生しそうに思えますが、
そのような状況で [CODE(HTMLe)@en[[[form]]]] [[要素]]を開くことがそもそもできないはずです。

* [CODE(HTMLa)@en[form]] 属性 (HTML)

@@ 以下は古い内容が含まれます。

[40]
[[HTML]] の[[フォーム制御子]]等の
[DFN[[CODE(HTMLa)@en[form]] [[属性]]]]は、
[[フォーム制御子]]が所属する[[フォーム]]を指定します。

[41]
:状態:[[WHATWG]] [[WD]]
:[[要素型]]:[[フォーム制御子]]、[CODE(HTMLe)@en[[[fieldset]]]]
:[[属性名]]:[CODE(HTMLa)@en[[[form]]]]
([Q@en[[[form]]]] ([Q@en[[[フォーム]]]]) より)
:[[属性値]]:[CODE@en[[[IDREFS]]]] (>>42)
:[[既定値]]:([[先祖]]により決定) (>>43)

** 仕様書

- [76] [[Web Applications 1.0]]
-- [77] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#form-owner>'''

** 属性値

[79] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]の[[属性値]]は、同じ[[文書]]の
[CODE(HTMLe)@en[[[form]]]] [[要素]]の [[ID]] でなければ[['''なりません''']] [SRC[>>77]]。

;;
[42]
[[Web Forms 2.0]] では、
[CODE(HTMLa)@en[[[form]]]] [[属性値]]は、
零個以上の
[CODE(HTMLe)@en[[[form]]]] [[要素]]の [CODE(XML)@en[[[ID]]]]
の[[空白]]区切り[[並び]]とされていました
[SRC@en[WF2 2.8]]。

** フォームの決定

[49]
[[利用者エージェント]]は、[[フォーム制御子]]や
[CODE(HTMLe)@en[[[fieldset]]]]
[[要素]]に関連付ける[[フォーム]]を次のように決定[['''しなければなりません''']]
[SRC@en[WF2 2.8]]:
= [CODE(HTMLa)@en[[[form]]]] [[属性]]があれば、
それに従います。
= [[直近]]の[[先祖]]である [CODE(HTMLe)@en[[[form]]]]
[[要素]]か、 [CODE(HTMLa)@en[[[form]]]] [[属性]]がある
[CODE(HTMLe)@en[[[fieldset]]]] [[要素]]があれば、
その[[フォーム]]とします。
= なければ、どの[[フォーム]]にも関連付けないとします。

[[#comment]]


** フォーム操作との関係

[50]
[[提出]][[ボタン]] ([CODE(HTML)@en[[[submit]]]]) や[[画像]]
([CODE(HTMLe)@en[[[image]]]]) は、
関連付けられた最初の[[フォーム]]のみを[[提出]][['''しなければなりません''']]。
[SRC@en[WF2 2.8]]

[51]
[[再設定]][[ボタン]] ([CODE(HTML)@en[[[reset]]]])
は、関連付けられたすべての[[フォーム]]を[[再設定]][['''しなければなりません''']]。
[SRC@en[WF2 2.8]]

[[#comment]]


** 誤り処理

[52]
[[文書]]中に複数現れる [CODE(XML)@en[[[ID]]]]
が [CODE(HTMLa)@en[[[form]]]] に指定された時に選択される[[フォーム]]は、
[CODE(DOMm)@en[[[getElementById]]]] [[メソッド]]と同じものと[['''しなければなりません''']]。
[SRC@en[WF2 2.8]]

;; [CODE(DOMm)@en[[[getElementById]]]] [[メソッド]]は、
その場合の動作は[[未定義]]としています。
しかし、 [CODE(HTMLa)@en[[[form]]]]
もそれと同じように動作しなければならない、ということです。

[53]
[CODE(HTMLa)@en[[[form]]]]
[[属性値]]中に同じ[[フォーム]]を複数回指定[['''してはなりません''']]。
[[利用者エージェント]]は、その場合、
最初の指定を除き、無視[['''しなければなりません''']]。
[SRC@en[WF2 2.8]]

** 例

[54]
[PRE(HTML example code)[
<table>
 <thead>
  <tr>
   <th>Name</th>
   <th>Value</th>
   <th>Action</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>
    <form id="edit1" action="/edit" method="post">
     <input type="hidden" name="id" value="1"/>
     <input type="text" name="name" value="First Row"/>
    </form>
   </td>
   <td>
    <input form="edit1" type="text" name="value"/>
   </td>
   <td>
    <input form="edit1" type="submit" name="Edit"/>
   </td>
  </tr>
  <tr>
   <td>
    <form id="edit2" action="/edit" method="post">
     <input type="hidden" name="id" value="2"/>
     <input type="text" name="name" value="Second Row"/>
    </form>
   </td>
   <td>
    <input form="edit2" type="text" name="value"/>
   </td>
   <td>
    <input form="edit2" type="submit" name="Edit"/>
   </td>
  </tr>
 </tbody>
</table>
]PRE]

[[列]]ごとに別の[[フォーム]]になっています。
[SRC@en[WF2 2.8]]
[CODE(HTMLe)@en[[tbody]]]] の[[内容モデル]]の定義から、
[[Web Forms 1.0]] ではこのように[[表]]と[[フォーム]]を組合せることができませんでした。

[55]
[PRE(HTML example code)[
<form action="test.cgi">
 <input type="text" name="q" form="fg fy">
 <input type="submit" name="t" value="Test">
</form>
<form id="fg" action="google.cgi"><input type="submit" value="Google"></form>
<form id="fy" action="yahoo.cgi"><input type="submit" value="Yahoo"></form>
]PRE]

テキスト欄は2つの[[フォーム]]に関連付けられています。
また、[[フォーム]]が3つあり、それぞれが[[提出]][[ボタン]]を持っています。
[SRC@en[WF2 2.8]]

[Q@en[Google]] と [Q@en[Yahoo]] の2つのボタンは、
それぞれ別の[[フォーム処理エージェント]]に、
同じテキスト欄の内容を[[提出]]します。

最初の [Q@en[Test]] は、 [[Web Forms 2.0]]
に適合した[[利用者エージェント]]では、
テキスト欄の内容を[[提出]]しません。
未対応の[[利用者エージェント]]はテキスト欄の内容を[[提出]]します。
これは古い[[利用者エージェント]]のための fallback
として使うことができます。

* 歴史

[REFS[
- [61] [CITE[Cougar: ideas for <A>,<INPUT>]] ([TIME[2004-08-06 01:45:46 +09:00]] 版) <http://lists.w3.org/Archives/Public/www-html/1996Jul/0537.html>
]REFS]

[128] >>61 では後の [CODE(HTMLa)@en[[[form]]]] [[属性]]に相当する [CODE(HTMLa)@en[[[for]]]]
[[属性]]が提案されていました。

** Web Forms 2.0

[44] [CODE(HTMLa)@en[[[form]]]] [[属性]]は [[Web Forms 2.0]] で導入されました。

[REFS[
-[78] [[Web Forms 2.0]] [CSECTION@en[2.8. The [CODE(HTMLa)@en[[[form]]]] attribute]]
<http://www.whatwg.org/specs/web-forms/current-work/#formAttribute>
]REFS]

*** 処理モデル

[43]
[[フォーム制御子]]は通常[[先祖]]の [CODE(HTMLe)@en[[[form]]]]
と関連付けられますが、
[CODE(HTMLa)@en[[[form]]]] [[属性]]はこれを上書きし、
関連付ける[[フォーム]]を明示的に指定します。
[SRC@en[WF2 2.8]]

[46]
指定された [CODE(XML)@en[[[ID]]]] のうち、
[[文書]]中の[[要素]]を[[識別]]しないものや、
[CODE(HTMLe)@en[[[form]]]] [[要素]]を[[識別]]しないものは、
無視[['''しなければなりません''']]。
[SRC@en[WF2 2.8]]

[47]
[[空文字列]]を[[属性値]]として指定する
(か、 >>46 の無視の結果 [CODE(XML)@en[[[ID]]]]
が1つも含まれない) と、
[[フォーム制御子]]はどの[[フォーム]]にも関連付けられていない状態となります。
[SRC@en[WF2 2.8]]

[48]
[CODE(HTMLe)@en[[[fieldset]]]] [[要素]]に指定した場合は、
その[[子孫]]の[[フォーム制御子]]を関連付ける[[フォーム]]を指定します。
[SRC@en[WF2 2.8]]

;; [[子孫]]の[[フォーム制御子]]や [CODE(HTMLe)@en[[[fieldset]]]]
で更に [CODE(HTMLa)@en[[[form]]]] が指定されている場合は、
そちらが優先します。

** HTML5

[129] [[WF2]] はその後 [[HTML5]] (旧 [[Web Applications 1.0]]、現在の [[HTML Standard]]) に統合されました。

[70] 一瞬だけ [[HTML5]] で [CODE(HTMLe)@en[[[legend]]]] [[要素]]にも
[CODE(HTMLa)@en[[[form]]]] [[属性]]が追加されていましたが、すぐに削除されました。

[136] [CODE(HTMLe)@en[[[meter]]]] と [CODE(HTMLe)@en[[[progress]]]] を[[フォーム被関連付け可能要素]]の一部である[[ラベル付け可能要素]]とするために
>>134 で [CODE(HTMLa)@en[[[form]]]] [[属性]]が追加されましたが、 >>135 で[[ラベル付け可能要素]]が[[フォーム被関連付け可能要素]]でなくても良いこととされ、
[CODE(HTMLa)@en[[[form]]]] [[属性]]も削除されました。

[REFS[
- [134] [CITE@en[Web Applications 1.0 r4531       Make <progress>, <meter>, and <output> labelable with <label>.]] ([TIME[2010-01-07 12:40:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=4530&to=4531>
- [135] [CITE@en[Web Applications 1.0 r6221      Remove <progress form> and <meter form> since they are basically useless.]] ([TIME[2011-06-14 09:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=6220&to=6221>
]REFS]

[130] [[HTML5]] では[[フォーム所有者]]の概念の詳細や[[構文解析]]との相互関係が歴史上はじめて明文化されました。

[REFS[
- [111] [CITE@en[Bug 17845 – Some algorithms in the HTML Parser must also override the "reset the form owner" (e.g., Adoption Agency algorithm)]]
( ([TIME[2013-02-17 10:48:51 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17845>
- [112] [CITE[IRC logs: freenode / #whatwg / 20130213]]
( ([TIME[2013-02-16 19:46:58 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130213>
- [113] [CITE@en[Web Applications 1.0 r8186 Clarify which call to 'reset the form owner' is suppressed.]]
( ([TIME[2013-09-14 08:31:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8185&to=8186>
- [114] [CITE[''''''[''''''whatwg'''''']'''''' Form-associated elements and the parser]]
( ([TIME[2013-09-17 00:43:23 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-September/040843.html>
- [115] [CITE[''''''[''''''whatwg'''''']'''''' Elements should be removed from the past names map once it's no longer associated with the form element]]
( ([TIME[2013-09-26 22:45:44 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-September/040898.html>
- [116] [CITE@en[Web Applications 1.0 r8188       Make parser-driven form element pointer associations not happen when the element is inserted into a different home subtree than the form element, to avoid cross-subtree associations (which otherwise wouldn't be possible).]] ([TIME[2013-09-17 02:35:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8187&to=8188>
- [117] [CITE@en[Web Applications 1.0 r8331       Change how the form element pointer affects parsing <template> elements, to reduce weirdness in templates (e.g. before you couldn't have a template that contained a form if it was itself inside a form).]] ([TIME[2013-12-05 04:02:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8330&to=8331>
- [118] [CITE@en[Web Applications 1.0 r8337       innerHTML on template contents works like outside templates, when it comes to forms.]] ([TIME[2013-12-10 06:17:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8336&to=8337>
- [121] [CITE@en[Web Applications 1.0 r8446     Turns out browsers reset the form owner not just when a node is taken from a document, but also when it's taken from a subtree. which makes sense.]]
( ([TIME[2014-01-31 06:51:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8445&to=8446>
- [131] [CITE@en[Web Applications 1.0 r8009     <img> is form-associated (because legacy), but doesn't have a form='' attribute (because sanity). So... update crazy town to be even more crazy.]] ([TIME[2013-07-03 06:17:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8008&to=8009>
]REFS]

[140] [CITE@en[HTML Speech Incubator Group Final Report]]
( ([TIME[2011-12-05 17:46:22 +09:00]] 版))
<http://www.w3.org/2005/Incubator/htmlspeech/XGR-htmlspeech-20111206/#dfn-form>

[16] [CITE@en[13549 – 4.10.18 associating form elements with forms that do not contain them can cause navigation problems for AT and keyboard users]]
([TIME[2016-03-05 18:47:49 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=13549>

[25] [CITE@en[Editorial: synchronize with the DOM Standard · whatwg/html@21c6ec7]]
([TIME[2016-03-20 18:13:39 +09:00]] 版)
<https://github.com/whatwg/html/commit/21c6ec77594eb89b836d4872222f5916910967fd>

[26] [CITE@en[Remove <label form> and redefine label.form IDL attribute]]
( ([[zcorpan]]著, [TIME[2016-04-28 22:48:52 +09:00]]))
<https://github.com/whatwg/html/commit/99f0f1ae017523276ea4dd5784ec63a23a23834d>

[27] [CITE@en-GB-x-Hixie[Web Forms 2.0]]
( ([TIME[2014-03-06 04:51:55 +09:00]]))
<https://whatwg.org/specs/web-forms/current-work/#formAttribute>

[12] [CITE@en[Make forms work in shadow trees]]
( ([[annevk]]著, [TIME[2016-05-12 00:45:25 +09:00]]))
<https://github.com/whatwg/html/commit/927fda0f305452a9c54a25d3ebf9a6ed5ae29fd3>

[68] [CITE@en[Clarify label.form IDL attribute]]
( ([[zcorpan]]著, [TIME[2016-05-26 01:47:30 +09:00]]))
<https://github.com/whatwg/html/commit/7894cba1f9f46064969f8e0f46a90e3c8d4dbad5>

[69] [CITE@en[Be more precise about nested and discarded browsing contexts]]
([[domenic]]著, [TIME[2016-07-20 22:58:49 +09:00]])
<https://github.com/whatwg/html/commit/39118df640ad4a3f03f164fb5ffe0a56316297be>

[73] [CITE@en[Remove <keygen>]]
([[domenic]]著, [TIME[2017-01-14 07:03:02 +09:00]])
<https://github.com/whatwg/html/commit/5baa38720f6e83c94a50018c4565808ad548d69c>

[74] [CITE@en[Track HTML parser form-associated elements with a flag]]
([[annevk]]著, [TIME[2017-08-19 16:02:48 +09:00]])
<https://github.com/whatwg/html/commit/384c30c56d6dfd26dfbd3a5024ae10e7f7134483>

[29] [CITE@en[28800 – Should 'reset form owner' be invoked on form-associated elements with no form owner when they are inserted into a subtree that is NOT IN the Document?]]
([TIME[2017-08-25 23:14:36 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=28800>

[67] [CITE@en["reset the form owner" is not quite right · Issue #2863 · whatwg/html]]
([TIME[2017-08-25 23:15:08 +09:00]])
<https://github.com/whatwg/html/issues/2863>

[86] [CITE@en[Track HTML parser form-associated elements with a flag by annevk · Pull Request #2874 · whatwg/html]]
([TIME[2017-08-25 23:15:48 +09:00]])
<https://github.com/whatwg/html/pull/2874>

[90] [CITE@en[Add the autocapitalize attribute]]
([[rlanday]]著, [TIME[2017-12-16 08:17:00 +09:00]])
<https://github.com/whatwg/html/commit/f1f0af83e320f14a59dc4e552ee82aab7908f00c>

[91] [CITE@en[Drop IMG element from form-associated elements · Issue #294 · whatwg/html]]
([TIME[2018-04-15 21:42:14 +09:00]])
<https://github.com/whatwg/html/issues/294>