[1] フォーム被関連付け要素は、フォーム所有子を持つことができる要素です
>>3。フォーム被関連付け要素は form
要素と関係を持つことができ、
これを要素のフォーム所有子といいます >>24。
[71] フォーム所有子は木構造に基づき自動的に決まりますが、 form
内容属性によって著者が上書きすることもできます。どの要素がフォーム所有子であるかは
form
IDL属性によって取得できます。
[124] フォーム被関連付け可能要素には次のような小分類があります。
[138] ただしラベル付け可能要素には、フォーム被関連付け可能要素でないものも含まれています。
[15] option
, optgroup
, legend
,
datalist
は含まれていません。
[132] object
は理論上はフォーム制御子として使えるため、ここに含まれています。
[133] img
は歴史的経緯から document.forms[n].imgname
のようにアクセスできるため、
内部的にフォームとの関連付けを保持しており、ここに含まれています。
[64] フォーム被関連付け要素は、次の状態を持ちます。
[72] フォーム被関連付け要素は、フォーム所有子を持ちます。
フォーム所有子は、 form
要素または null です >>24。
[65] フォーム所有子は、原則として次のように決まります。
[85] フォーム被関連付け要素要素のフォーム所有者の再設定は、 次のようにしなければなりません >>24。
... <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> ...
e
要素のフォーム所有子は c
ではなく
a
になります >>24。
innerHTML
が内部的にHTML構文解析器で解釈を終えた時点では、確かに
e
のフォーム所有者は c
です (form
要素が閉じられていませんから)。ところが e
要素が b
要素の子供となった瞬間に、フォーム所有者の再設定が起こり、
a
に選び直されます。
[96] HTML構文解析器の form
要素指示子は、
最後に開かれて閉じていない form
要素を指すものです
>>98。
[147] form
要素指示子は、スクリプト無効な構文解析器でも実装する必要があります。
(値によって構文解析の結果が変化します。) しかしフォーム所有者の再設定の呼び出しは、
スクリプトとフォームを実装していないなら、省略できます。
[105] つまり、開始タグがあって終了タグが(まだ)ない最後の form
要素を指している状態になっています。
[141] form
終了タグは、たとえそれによって閉じられる
form
要素が存在していなくても、
form
要素指示子を null に設定する効果があります。
table
などをトリッキーに使って、あるいは素片構文解析によってそのような状況が生じることがあります。
[142] ただし、素片構文解析の場合は、一時的に架空の木において構文解析を行った後、
得られた節点が指定された位置に挿入される、という形を取っており、
最終的な挿入は構文解析器による挿入ではありませんから、
たとえform
要素指示子により特別なフォーム所有者の関連付けが行われていたとしても、
再設定により失われてしまいます。
[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>
の例では、 form
要素の innerHTML
を設定しています。その場合form
要素指示子が設定されてから構文解析がはじまるので、
form
開始タグは無視されます。ところが本例では
form
終了タグによってform
要素指示子が
null に設定されるため、 form
開始タグは無視されず、
form
要素が作られます。
[144] ただし form
要素は里親付けにより table
要素の兄となり、 td
要素内の
input
要素はその form
要素の子孫とはなりません。
それでもform
要素指示子によって両者は一旦関連付けられるのですが、
素片構文解析の全体が完了した後、得られた要素が1つ目の form
要素の子供として挿入され、フォーム所有者の再設定が実行されます。
この時に木構造に従いフォーム所有者が決定されるので、
input
要素のフォーム所有者は変更されるのです。
[145] なお、先祖に form
要素が存在するケースの素片構文解析では、
form
要素指示子が構文解析中に変更されない場合、
構文解析の時点ではフォーム所有者は設定されず、
最後の挿入の時点で木構造に従いフォーム所有者が決まることになります。
[106] form
要素指示子が form
要素を指している間は
HTML構文解析器が form
要素を新たに作ることはありません。
つまり、 form
要素の入れ子状態を HTML構文解析器自身が作り出すことはありません。
[119] template
要素内ではform
要素指示子は無視され、
フォーム制御子とフォームの関連付けは行われません。
[146] 構文解析器が AAA によって要素を移動した場合、
構文解析器による挿入としてではなく、
通常の insert として処理されるため、
結果的にform
要素指示子は無視されます。
[107] form
要素指示子は、HTML構文解析器によってフォーム被関連付け要素が文書に挿入される時点でフォーム所有者の決定に使われます
(>>95)。
[109] フォーム所有者の再設定が起こる (>>108) と
form
要素指示子の影響で生じたフォームとの関連付けは解消されます。
従ってform
要素指示子の影響は構文解析の直後に限定されます
(といっても構文解析は innerHTML
などでいつでも発生し得ます)。
form
要素指示子がなかった場合との違いが生じるのは、
form
要素が終了タグ無しで閉じられた後に続くフォーム制御子が、 form
要素の子孫でもないのに関連付けられる場合だけです。
form
属性 (HTML)[40]
HTML のフォーム制御子等の
form
属性は、
フォーム制御子が所属するフォームを指定します。
[49]
利用者エージェントは、フォーム制御子や
fieldset
要素に関連付けるフォームを次のように決定しなければなりません
WF2 2.8:
[50]
提出ボタン (submit
) や画像
(image
) は、
関連付けられた最初のフォームのみを提出しなければなりません。
WF2 2.8
[51]
再設定ボタン (reset
)
は、関連付けられたすべてのフォームを再設定しなければなりません。
WF2 2.8
[52]
文書中に複数現れる ID
が form
に指定された時に選択されるフォームは、
getElementById
メソッドと同じものとしなければなりません。
WF2 2.8
[53]
form
属性値中に同じフォームを複数回指定してはなりません。
利用者エージェントは、その場合、
最初の指定を除き、無視しなければなりません。
WF2 2.8
<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>
列ごとに別のフォームになっています。
WF2 2.8
[tbody
]] の内容モデルの定義から、
Web Forms 1.0 ではこのように表とフォームを組合せることができませんでした。
<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>
テキスト欄は2つのフォームに関連付けられています。 また、フォームが3つあり、それぞれが提出ボタンを持っています。 WF2 2.8
Google
と Yahoo
の2つのボタンは、
それぞれ別のフォーム処理エージェントに、
同じテキスト欄の内容を提出します。
最初の Test
は、 Web Forms 2.0
に適合した利用者エージェントでは、
テキスト欄の内容を提出しません。
未対応の利用者エージェントはテキスト欄の内容を提出します。
これは古い利用者エージェントのための fallback
として使うことができます。
[128] >>61 では後の form
属性に相当する for
属性が提案されていました。
[44] form
属性は Web Forms 2.0 で導入されました。
form
attribute
<http://www.whatwg.org/specs/web-forms/current-work/#formAttribute>[43]
フォーム制御子は通常先祖の form
と関連付けられますが、
form
属性はこれを上書きし、
関連付けるフォームを明示的に指定します。
WF2 2.8
[46]
指定された ID
のうち、
文書中の要素を識別しないものや、
form
要素を識別しないものは、
無視しなければなりません。
WF2 2.8
[47]
空文字列を属性値として指定する
(か、 >>46 の無視の結果 ID
が1つも含まれない) と、
フォーム制御子はどのフォームにも関連付けられていない状態となります。
WF2 2.8
[48]
fieldset
要素に指定した場合は、
その子孫のフォーム制御子を関連付けるフォームを指定します。
WF2 2.8
[129] WF2 はその後 HTML5 (旧 Web Applications 1.0、現在の HTML Standard) に統合されました。
[70] 一瞬だけ HTML5 で legend
要素にも
form
属性が追加されていましたが、すぐに削除されました。
[136] meter
と progress
をフォーム被関連付け可能要素の一部であるラベル付け可能要素とするために
>>134 で form
属性が追加されましたが、 >>135 でラベル付け可能要素がフォーム被関連付け可能要素でなくても良いこととされ、
form
属性も削除されました。
[130] HTML5 ではフォーム所有者の概念の詳細や構文解析との相互関係が歴史上はじめて明文化されました。
[140] HTML Speech Incubator Group Final Report ( ( 版)) <http://www.w3.org/2005/Incubator/htmlspeech/XGR-htmlspeech-20111206/#dfn-form>
[16] 13549 – 4.10.18 associating form elements with forms that do not contain them can cause navigation problems for AT and keyboard users ( 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=13549>
[25] Editorial: synchronize with the DOM Standard · whatwg/html@21c6ec7 ( 版) <https://github.com/whatwg/html/commit/21c6ec77594eb89b836d4872222f5916910967fd>
[26] Remove <label form> and redefine label.form IDL attribute ( (zcorpan著, )) <https://github.com/whatwg/html/commit/99f0f1ae017523276ea4dd5784ec63a23a23834d>
[27] Web Forms 2.0 ( ()) <https://whatwg.org/specs/web-forms/current-work/#formAttribute>
[12] Make forms work in shadow trees ( (annevk著, )) <https://github.com/whatwg/html/commit/927fda0f305452a9c54a25d3ebf9a6ed5ae29fd3>
[68] Clarify label.form IDL attribute ( (zcorpan著, )) <https://github.com/whatwg/html/commit/7894cba1f9f46064969f8e0f46a90e3c8d4dbad5>
[69] Be more precise about nested and discarded browsing contexts (domenic著, ) <https://github.com/whatwg/html/commit/39118df640ad4a3f03f164fb5ffe0a56316297be>
[73] Remove <keygen> (domenic著, ) <https://github.com/whatwg/html/commit/5baa38720f6e83c94a50018c4565808ad548d69c>
[74] Track HTML parser form-associated elements with a flag (annevk著, ) <https://github.com/whatwg/html/commit/384c30c56d6dfd26dfbd3a5024ae10e7f7134483>
[29] 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? () <https://www.w3.org/Bugs/Public/show_bug.cgi?id=28800>
[67] "reset the form owner" is not quite right · Issue #2863 · whatwg/html () <https://github.com/whatwg/html/issues/2863>
[86] Track HTML parser form-associated elements with a flag by annevk · Pull Request #2874 · whatwg/html () <https://github.com/whatwg/html/pull/2874>
[90] Add the autocapitalize attribute (rlanday著, ) <https://github.com/whatwg/html/commit/f1f0af83e320f14a59dc4e552ee82aab7908f00c>
[91] Drop IMG element from form-associated elements · Issue #294 · whatwg/html () <https://github.com/whatwg/html/issues/294>