コントロールとフォームの関連づけ
4.10.18 コントロールとフォームの関連づけ
フォーム関連要素は、form 要素との関連を持つことができます。この form 要素のことを、フォーム・オーナーと呼びます。フォーム関連要素が form 要素と関連づけされない場合、そのフォーム・オーナーは null であると言います。
フォーム関連要素は、デフォルトでは、その直近の祖先となる form 要素と関連づけられますが(後述の通り)、form 属性を指定すれば、これより優先させることができます。
この機能によって、ウェブ制作者は、ネストされた form 要素がサポートされなかったときの回避策として使うことができます。
フォーム関連要素に form 属性を指定するなら、その値は、その要素のオーナーとなる Document の中にある form 要素の ID でなければいけません。
準拠ドキュメントにおいては、ネストされた form 要素が含まれることはありえませんが、このセクションの規則では、そういったネストされた要素を持つドキュメントを生成することは可能となります(DOM を操作するスクリプトを使うなどして)。HTML パーサーの規則では、歴史的な理由から、祖先ではない form 要素と関連づけられるフォーム関連要素があり得ますので、この規則は複雑なものとなります。
フォーム関連要素が生成されるとき、そのフォーム・オーナーは null で初期化されなければいけません(オーナーを持ちません)。
フォーム関連要素がフォームと関連づけられるとき、そのフォーム・オーナーは、そのフォームにセットされなければいけません。
フォーム関連要素やその祖先のひとつが挿入されたり Document から削除されたなどの理由で、フォーム関連要素の祖先とのつながりに変更があったとき、ユーザーエージェントはその要素のフォーム・オーナーをリセットしなければいけません。HTML パーサー は、フォーム・コントロールを挿入するときは、この要件を無効にします。
フォーム関連要素の form 属性が追加されたり、削除されたり、その値が変更されたとき、ユーザーエージェントは、その要素のフォーム・オーナーをリセットしなければいけません。
フォーム関連要素が form 属性を持ち、Document の中にあるその form 要素の ID が変更されたとき、ユーザーエージェントは、そのフォーム関連要素のフォーム・オーナーをリセットしなければいけません。
フォーム関連要素が form 属性を持ち、ID を持つ要素が Document に挿入されたり削除されたら、ユーザーエージェントは、そのフォーム関連要素のフォーム・オーナーをリセットしなければいけません。
ユーザーエージェントがフォーム関連要素のフォーム・オーナーをリセットすることになったとき、次の手順を実行しなければいけません:
-
該当の要素のフォーム・オーナーが null ではなく、その要素に
formコンテンツ属性が存在せず、そして、その要素のフォーム・オーナーが、祖先とのつながりを変更された後でも、その要素の祖先のひとつであるなら、何もせず、この手順を中止します。 -
該当の要素のフォーム・オーナーを null とします。
-
該当の要素が
formコンテンツ属性を持つなら、次の副手順を実行します: -
そうでなければ、該当のフォーム関連要素が
form要素を祖先に持つなら、そのフォーム関連要素を、その直近の祖先のform要素と関連づけます。 -
そうでなければ、その要素の関連づけはないままとなります。
次は非準拠です:
...
<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>
...
"d" のフォーム・オーナーは、内部にネストされたフォーム "c" となるでしょう。一方、"e" のフォーム・オーナーは、外側にあるフォーム "a" となるでしょう。
これは、HTML パーサーで "e" を "c" と関連づけたにもかかわらず、innerHTML アルゴリズムがそのノードを一時的なドキュメントから "b" 要素に移動するとき、そのノードは、その祖先とのつながりが変更されたことが分かり、ゆえに、その親によってなされたすべての "不思議な" 関連づけは、通常の祖先の関連づけにリセットされるからです。
ただし、この例は、非準拠ドキュメントです。form 要素をネストするのは、コンテンツ・モデルに違反しているからです。