[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属性]]によって取得できます。 * 仕様書 - [2] [[Web Applications 1.0]] ([[HTML5]]) -- [3] '''''' --- [[フォーム被関連付け要素]] -- [24] '''''' --- [[フォーム所有者]] -- [94] * 分類 ** フォーム被関連付け要素の一覧 - [4] [CODE(HTMLe)@en[[[button]]]] - [5] [CODE(HTMLe)@en[[[fieldset]]]] - [6] [CODE(HTMLe)@en[[[input]]]] - [7] [CODE(HTMLe)@en[[[keygen]]]] - [8] [CODE(HTMLe)@en[[[label]]]] - [9] [CODE(HTMLe)@en[[[meter]]]] - [10] [CODE(HTMLe)@en[[[object]]]] - [11] [CODE(HTMLe)@en[[[output]]]] - [12] [CODE(HTMLe)@en[[[progress]]]] - [13] [CODE(HTMLe)@en[[[select]]]] - [14] [CODE(HTMLe)@en[[[textarea]]]] [15] [CODE(HTMLe)@en[[[option]]]], [CODE(HTMLe)@en[[[optgroup]]]], [CODE(HTMLe)@en[[[legend]]]], [CODE(HTMLe)@en[[[datalist]]]] は含まれていません。 ** 小分類の一覧 - [17] [[フォーム被関連付け要素]] -- [18] [[被列挙要素]] -- [19] [[名札付け可能要素]] -- [20] [[提出可能要素]] --- [22] [[ボタン]] ---- [23] [[提出ボタン]] -- [21] [[再設定可能要素]] * フォーム所有子 [72] [[フォーム所有子]]は、[[null]] または [CODE(HTMLe)@en[[[form]]]] [[要素]]1つです [SRC[>>24]]。 - [74] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]が [CODE(HTMLa)@en[[[form]]]] [[要素]]の [[ID]] を正しく指していれば、その [CODE(HTMLa)@en[[[form]]]] [[要素]]が[[フォーム所有子]]です。 - [73] [[直近祖先]]の [CODE(HTMLe)@en[[[form]]]] [[要素]]があれば、それが[[フォーム所有子]]です。 - [75] そうでなければ、[[フォーム所有子]]は [[null]] です。 ** フォーム所有子の変化 [108] [[フォーム所有者]]は次の場合に変化します。 - [80] [[フォーム被関連付け要素]]が作られた時点では[[フォーム所有者]]は [[null]] でなければ[['''なりません''']] [SRC[>>24]]。 - [81] [[フォーム被関連付け要素]]が[[フォーム]]に[DFN[[RUBYB[関連付けられる]@en[associated]]]] ([DFN[[RUBYB[フォーム関連付け]@en[form association]]]]) と、[[フォーム所有者]]はその[[フォーム]]に設定されなければ[['''なりません''']] [SRC[>>24]]。 - [82] [[フォーム被関連付け要素]]の[RUBYB[[[祖先鎖]]]@en[ancestor chain]]に異動があれば、[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。 - [84] [[フォーム被関連付け要素]]の [CODE(HTMLa)@en[[[form]]]] [[内容属性]]が追加・変更・削除された時は、[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。 - [83] [[フォーム被関連付け要素]]が [CODE(HTMLa)@en[[[form]]]] [[内容属性]]を持つ場合、[[文書]]内の[[要素]]の [[ID]] が変化したり、[[ID]] を持った[[要素]]が[[文書]]に追加・削除されたりしたときは、[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。 - [95] [[HTML構文解析器]]による[RUBYB[[[HTML要素の挿入]]]@en[insert an HTML element]]によって[[フォーム被関連付け要素]]が作られた場合であって、[[[CODE(HTMLe)@en[form]]要素指示子]]が [[null]] ではなく、[CODE(HTMLa)@en[[[form]]]] [[内容属性]]がない場合、挿入の直前に[[[CODE(HTMLe)@en[form]]要素指示子]]が指す [CODE(HTMLe)@en[[[form]]]] [[要素]]を[RUBYB[関連付け]@en[associate]]しなければなりません [SRC[>>94]]。 ** フォーム所有者の再設定 [85] [[フォーム被関連付け要素]]の[DFN[[RUBYB[フォーム所有者を再設定]@en[reset the form owner]]]]する場合は次のようにしなければなりません [SRC[>>24]]。 = [86] [[フォーム所有者]]が [[null]] でなく、[CODE(HTMLa)@en[[[form]]]] [[内容属性]]がなく、[[祖先鎖]]が変化した後であっても[[フォーム所有者]]が[[直近祖先]]たる [CODE(HTMLa)@en[[[form]]]] [[要素]]のままなら、 == 何もせずに終わります。 = [87] [[フォーム所有子]]を [[null]] とします。 = [88] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]があれば、 == [89] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]の値と一致する [[ID]] を持った[[文書]]中の最初の[[要素]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]なら、 === その [CODE(HTMLe)@en[[[form]]]] と[RUBYB[関連付け]@en[associate]]ます。 == 終わります。 = [90] そうではなく、[[祖先]]に [CODE(HTMLe)@en[[[form]]]] [[要素]]があるなら、 == [[直近祖先]]たる [CODE(HTMLe)@en[[[form]]]] [[要素]]と[RUBYB[関連付け]@en[associate]]ます。 = [91] そうでないなら、どの[[フォーム]]とも関連付けないままにします。 [92] つまり、>>73-75 のような状況を新たな木構造の元で再構築するということですね。 ** 例 [93] [PRE(HTML bad example code)[ ...
... ]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]] に選び直されます。 * form 要素指示子 [96] [[HTML構文解析器]]の [DFN[[CODE(HTMLe)@en[form]] [RUBYB[要素指示子]@en[element pointer]]]]は、 最後に開かれて閉じていない [CODE(HTMLe)@en[[[form]]]] [[要素]]を指すものです [SRC[>>98]]。 ** 仕様書 - [97] [[Web Applications 1.0]] ([[HTML5]]) -- [98] '''''' -- [100] -- [101] ** 値の変化 - [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]]。 [105] つまり、[[開始タグ]]があって[[終了タグ]]が(まだ)ない最後の [CODE(HTMLe)@en[[[form]]]] [[要素]]を指している状態になっています。 ** 構文解析への影響 [106] [[[CODE(HTMLe)@en[form]]要素指示子]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]を指している間は [[HTML構文解析器]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]を新たに作ることはありません。 つまり、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の入れ子状態を [[HTML構文解析器]]自身が作り出すことはありません。 ** 関連 [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] '''''' ** 属性値 [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]] ** 歴史 [61] [CITE[Cougar: ideas for ,]] ([TIME[2004-08-06 01:45:46 +09:00]] 版) [CODE(HTMLa)@en[[[form]]]] [[属性]]に相当する [CODE(HTMLa)@en[[[for]]]] [[属性]]が提案されていました。 *** Web Forms 2.0 [56] この[[属性]]は [[Web Forms 2.0]] で導入されました。 **** 仕様書 -[44] [[Web Forms 2.0]] --[78] [CSECTION@en[2.8. The [CODE(HTMLa)@en[[[form]]]] attribute]] **** 処理モデル [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 [70] 一瞬だけ [[HTML5]] で [CODE(HTMLe)@en[[[legend]]]] [[要素]]にも [CODE(HTMLa)@en[[[form]]]] [[属性]]が追加されていましたが、すぐに削除されました。 ** 例 [54] [PRE(HTML example code)[
Name Value Action
]PRE] [[列]]ごとに別の[[フォーム]]になっています。 [SRC@en[WF2 2.8]] [CODE(HTMLe)@en[[tbody]]]] の[[内容モデル]]の定義から、 [[Web Forms 1.0]] ではこのように[[表]]と[[フォーム]]を組合せることができませんでした。 [55] [PRE(HTML example code)[
]PRE] テキスト欄は2つの[[フォーム]]に関連付けられています。 また、[[フォーム]]が3つあり、それぞれが[[提出]][[ボタン]]を持っています。 [SRC@en[WF2 2.8]] [Q@en[Google]] と [Q@en[Yahoo]] の2つのボタンは、 それぞれ別の[[フォーム処理エージェント]]に、 同じテキスト欄の内容を[[提出]]します。 最初の [Q@en[Test]] は、 [[Web Forms 2.0]] に適合した[[利用者エージェント]]では、 テキスト欄の内容を[[提出]]しません。 未対応の[[利用者エージェント]]はテキスト欄の内容を[[提出]]します。 これは古い[[利用者エージェント]]のための fallback として使うことができます。 [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]] 版)) [112] [CITE[IRC logs: freenode / #whatwg / 20130213]] ( ([TIME[2013-02-16 19:46:58 +09:00]] 版)) [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]] 版))