フォームコントロールの基盤

4.10.18 フォームコントロールの基盤

4.10.18.1 フォームコントロールの値

フォームコントロールは、チェック状態を持ちます。(後者は input 要素だけに使われます) これらは、ユーザーがそのコントロールとどのようにやりとりするのかを記述するために使われます。

input 要素の multiple 属性があった場合の制約バリデーションの挙動を定義するために、input 要素は、別々に定義済みのを持つこともできます。

4.10.18.2 ミュータビリティ

フォームコントロールは、ミュータブルであるとして指定することができます。

これは、ユーザーがフォームコントロールのチェック状態を変更することができるか否か、または、コントロールが自動的に埋められることができるか否かを、決定します(本仕様の定義と要件の手段を使いますが、要素がそう指定されているかどうかに依ります)。

4.10.18.3 コントロールとフォームの関連づけ

フォーム関連要素は、form 要素との関連を持つことができまが、それをその要素のフォームオーナーと呼びます。フォーム関連要素form 要素と関連づけされない場合、そのフォームオーナーは null であると言います。

フォーム関連要素は、デフォルトでは、その直近の祖先となる form 要素と関連づけられますが(後述の通り)、それが再関連付け可能であり、かつ、form 属性が指定されれば、これより優先させることができます。

この機能によって、ウェブ制作者は、ネストされた form 要素がサポートされなかったときの回避策として使うことができます。

再関連付け可能フォーム関連要素form 属性を指定するなら、その属性値は、その要素のオーナーとなる Document の中にある form 要素の ID でなければいけません。

準拠ドキュメントにおいては、ネストされた form 要素が含まれることはありえませんが、そういったネストされた要素を持つドキュメントを生成することは可能となります(DOM を操作するスクリプトを使うなどして)。この事実があるため、このセクションの規則は複雑です。さらに、HTML パーサーの規則では、歴史的な理由から、祖先ではない form 要素と関連づけられるフォーム関連要素があり得ますので、この規則は複雑なものとなります。

フォーム関連要素が生成されるとき、そのフォームオーナーは null で初期化されなければいけません(オーナーを持ちません)。

フォーム関連要素がフォームと関連づけられるとき、そのフォームオーナーは、そのフォームにセットされなければいけません。

フォーム関連要素やその祖先のひとつが Document に挿入されるとき、ユーザーエージェントはそのフォーム関連要素フォームオーナーをリセットしなければいけません。HTML パーサーは、フォームコントロールを挿入するときは、この要件を無効にします。

要素が Documentから削除された結果として、フォーム関連要素フォームオーナー(もしあれば)が同じホームサブツリーから無くなってしまったら、ユーザーエージェントは、そのフォーム関連要素フォームオーナーをリセットしなければいけません。

再関連付け可能フォーム関連要素form 属性がセットされたり、変更されたり、削除されたとき、ユーザーエージェントは、その要素のフォームオーナーをリセットしなければいけません。

再関連付け可能フォーム関連要素form 属性を持ち、Document の中にあるいかなる要素の ID が変更されたとき、ユーザーエージェントは、そのフォーム関連要素フォームオーナーをリセットしなければいけません。

再関連付け可能フォーム関連要素form 属性を持ち、ID を持つ要素が Document挿入されたり削除されたら、ユーザーエージェントは、そのフォーム関連要素フォームオーナーをリセットしなければいけません。

ユーザーエージェントがフォーム関連要素フォームオーナーをリセットすることになったとき、次の手順を実行しなければいけません:

  1. 該当の要素のフォームオーナーが null ではない、かつ、その要素が再関連付け可能でないか form コンテント属性が存在しない、かつ、その要素のフォームオーナーが、祖先とのつながりを変更された後でも、その要素の直近の祖先となる form 要素なら、何もせず、この手順を中止します。

  2. 該当の要素のフォームオーナーを null とします。

  3. 該当の要素が再関連付け可能form コンテント属性を持ち、Document の中にいるなら、次の副手順を実行します:

    1. Document の中で、該当の要素の form コンテント属性の値に大文字と小文字を区別して一致する ID を持った要素があり、その最初の要素が form 要素であれば、該当のフォーム関連要素をその form 要素と関連づけます。

    2. "フォームオーナーをリセット" する手順を中止します。

  4. そうでなければ、該当のフォーム関連要素form 要素を祖先に持つなら、そのフォーム関連要素を、その直近の祖先の form 要素と関連づけます。

  5. そうでなければ、その要素の関連づけはないままとなります。

次は非準拠です:

...
 <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" となるでしょう。

これは、次のようにして発生します:まず、"e" ノードが HTML パーサーの中で "c" と関連づけられます。それから、innerHTML アルゴリズムが、そのノードを一時的なドキュメントから "b" 要素に移動します。この時点で、そのノードは、自身の祖先とのつながりが変わったことが分かり、ゆえに、パーサーによってなされたすべての "不思議な" 関連性は、通常の祖先との関連性にリセットされます。

ただし、この例は、非準拠ドキュメントです。form 要素をネストするのは、コンテントモデルに違反しているからです。

element . form

該当の要素のフォームオーナーを返します。

なければ null を返します。

再関連付け可能フォーム関連要素は、form IDL 属性を持ちます。取得時においては、その要素のフォームオーナーを返さなければいけません。なければ null を返さなければいけません。


※ 原文:http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#form-control-infrastructure