HTML 属性: form
form
は HTML の属性で、フォーム関連要素を、同じ文書内の <form>
要素に関連付けます。この属性は、<button>
、<fieldset>
、<input>
、<object>
、<output>
、<select>
、<textarea>
の各要素に適用されます。
値
この要素を関連付ける <form>
要素の id
属性値。
使用上のメモ
既定では、フォームコントロールは最も近い祖先の <form>
要素に関連付けられます。一方、<form>
内に含まれていないフォームコントロールは、どのフォームにも関連付けられません。form
属性を使用すると、これらの既定の動作を上書きできます。
form
属性を指定することで、<button>
、<fieldset>
、<input>
、<object>
、<output>
、<select>
、<textarea>
の各要素に明示的にフォームオーナーを指定することができます。これにより、 あるフォームコントロールを、同じ文書内の任意の場所に配置された <form>
要素に関連付けられた状態にすることができます。
フォームが送信されると、 <form>
要素に関連付けられたコントロールの名前と値が送信されます。これらは物理的にその <form>
内に含まれていなくても、また別の <form>
内に含まれていても、送信対象となります。
コントロールの form
属性は、そのコントロールを関連付けたい <form>
要素の id
を値として取ります。それ以外の値を form
属性に設定してもすべて無視されます。
属性値を最も近い祖先 <form>
の id
に設定することは必須ではありませんが、あるフォームコントロールとその最も近い祖先フォームとの関連を明示的に定義することで、スクリプトや不正な HTML によってその特定の <form>
がコントロールの最も近い祖先フォームでなくなった場合でも、フォームコントロールがフォームから切り離されることがないよう にします。
祖先ではないフォームとの関連付け
form
属性を使用することで、ある <form>
に含まれたフォームコントロールを別の <form>
と関連付けられます。
このサンプルコードでは、ユーザー名の <input>
は internalForm
内に含まれていますが、 form
属性によって、このコントロールは含まれている祖先フォームから切り離され、代わりに externalForm
に関連付けられています。
<form id="externalForm"></form>
<form id="internalForm">
<label for="username">ユーザー名:</label>
<input form="externalForm" type="text" name="username" id="username" />
</form>
この場合、 externalForm
が送信されたときにユーザー名が送信されますが、 internalForm
には関連付けられたフォームコントロールは存在しません。
form
属性は継承されない
form
属性は、それが設定された要素のみに関連付けます。この属性の動作は継承されません。例えば、 <fieldset>
要素に form
属性が設定された場合、関連付けられるのは <fieldset>
のみであり、その <fieldset>
内に含まれるフォームコントロールは自動的には関連付けられません。
この例では、 <fieldset>
と username
の <input>
は exampleForm
に関連付けられており、HTMLFormControlsCollection
のプロパティである HTMLFormElement.elements
に含まれていますが、 password
は含まれません。 exampleForm
が送信される際には、 username
のみが含まれます。
<form id="exampleForm"></form>
<fieldset form="exampleForm">
<legend>ログイン情報</legend>
<label
>ユーザー名: <input form="exampleForm" type="text" name="username"
/></label>
<label>パスワード: <input type="password" name="password" /></label>
</fieldset>
それぞれの入れ子要素は、自分自身で form
属性を持つか、フォーム内に含まれている必要があります。どの要素がフォームに関連付けられたかは、 JavaScript を使用して HTMLFormElement.elements で調べることができます。
フォーム送信
form
属性を設定しても、その要素がフォームと共に送信されるということではありません。送信可能な要素(<button>
、<input>
、<select>
、<textarea>
など)のみが、関連付けられた <form>
が送信された際にその名前と値が送信されます。
この場合、たとえ <output>
が暗黙的に、そして明示的に calcForm
に関連付けられたとしても、 calcForm
が送信される際に result
は a
や b
につけて送信されません。ただし、 result
はフォームの HTMLFormControlsCollection
の一部です。
<form id="calcForm">
<label>1 つ目の数値: <input id="a" value="2" type="number" /></label>
<label>2 つ目の数値: <input id="b" value="3" type="number" /></label>
<label>合計: <output name="result" for="a b" form="calcForm">5</output></label>
</form>
例
>基本的な例
この例では、明示的に <form>
要素内に含まれていなくても、 form
属性を使用してフォーム関連要素を <form>
要素に関連付ける方法を示しています。この例では表示されるフォーム関連要素はすべて、暗黙的に(フォーム内に直接含まれていることで)または明示的に(form
属性を通じて) loginForm
に関連付けられた状態にあります。ログインフォームが送信されると、それぞれの送信可能な要素の名前と値が記載されます。
<form id="loginForm">
<label>ユーザー名: <input type="text" name="username" /></label>
</form>
<label
>パスワード: <input form="loginForm" type="password" name="password"
/></label>
<label>
選択してください:
<select form="loginForm" name="options">
<option value="A">A</option>
<option value="B">B</option>
</select>
</label>
<label
>説明:
<textarea form="loginForm" rows="4" name="description">
Hello, World!</textarea
>
</label>
<button form="loginForm" type="submit" name="submitLogin" value="Login">
送信
</button>
異なるフォームに関連付けられた要素
この例では、 <form>
要素が parentForm
と targetForm
の 2 つがあります。 parentForm
内の <button>
は、 form
属性が targetForm
に設定されており、最も近い祖先要素である parentForm
との関連付けを解除し、代わりに targetForm
に関連付けられています。送信ボタンが押されると、その祖先である parentForm
ではなく、 targetForm
が送信されます。
<form id="targetForm">
<input type="text" name="targetInput" />
</form>
<form id="parentForm">
<button form="targetForm" type="submit" name="submitTarget" value="Target">
Submit target form
</button>
</form>
仕様書
Specification |
---|
HTML> # attr-fae-form> |
ブラウザーの互換性
>html.elements.button.form
Loading…
html.elements.fieldset.form
Loading…
html.elements.input.form
Loading…
html.elements.object.form
Loading…
html.elements.output.form
Loading…
html.elements.select.form
Loading…
html.elements.textarea.form
Loading…