このようなHTMLフォームをネストすることは可能ですか
<form name="mainForm">
<form name="subForm">
</form>
</form>
両方の形式が機能するように?私の友人はこれに問題を抱えています、subForm
作品の一部、それ以外の部分にはありません。
一言で言えば、いいえ。 1ページに複数のフォームを含めることができますが、それらを入れ子にしないでください。
html5ワーキングドラフト から:
4.10.3
form
要素コンテンツモデル:
フローの内容。ただし、フォーム要素の子孫はありません。
2番目の形式は無視されます。たとえばWebKitの スニペット を参照してください。
bool HTMLParser::formCreateErrorCheck(Token* t, RefPtr<Node>& result)
{
// Only create a new form if we're not already inside one.
// This is consistent with other browsers' behavior.
if (!m_currentFormElement) {
m_currentFormElement = new HTMLFormElement(formTag, m_document);
result = m_currentFormElement;
pCloserCreateErrorCheck(t, result);
}
return false;
}
私は同じような問題に出くわしました、そしてそれが質問への答えではないことを私は知っています、しかしそれはこの種の問題を持つ誰かにとって助けになることができます:
複数の形式の要素を与えられた順序で並べる必要がある場合は、HTML5<input> form
属性が解決策になります。
から http://www.w3schools.com/tags/att_input_form.asp :
- FormattributeはHTML 5で新しく追加されました。
<form>
要素がどの<input>
要素に属するかを指定します。この属性の値は、同じ文書内の<form>
要素のid属性でなければなりません。
シナリオ:
実装:
<form id="Form1" action="Action1.php" method="post"></form>
<form id="Form2" action="Action2.php" method="post"></form>
<input type="text" name="input_Form1_n1" form="Form1" />
<input type="text" name="input_Form2_n1" form="Form2" />
<input type="text" name="input_Form1_n2" form="Form1" />
<input type="text" name="input_Form2_n2" form="Form2" />
<input type="submit" name="button1" value="buttonVal1" form="Form1" />
<input type="submit" name="button2" value="buttonVal2" form="Form2" />
ここで ブラウザの互換性がわかります。
プレーンHTMLでは、これを許可していません。しかし、JavaScriptを使えばそれが可能になります。 javascript/jqueryを使用している場合は、フォーム要素をクラスで分類してから、serialize()を使用して送信するアイテムのサブセットのフォーム要素のみをシリアル化できます。
<form id="formid">
<input type="text" class="class1" />
<input type="text" class="class2">
</form>
それからあなたのJavaScriptであなたはclass1要素を直列化するためにこれを行うことができます
$(".class1").serialize();
Class2のためにあなたができる
$(".class2").serialize();
フォーム全体
$("#formid").serialize();
あるいは単に
$("#formid").submit();
AngularJSを使用している場合、<form>
内のng-app
タグは、実行時にネストするように設計されたngForm
ディレクティブに置き換えられます。
Angularでは、フォームを入れ子にすることができます。これは、すべての子フォームが有効であるときに外側のフォームが有効であることを意味します。ただし、ブラウザでは
<form>
要素のネストは許可されていないため、Angularは<form>
と同じように動作しますがネストすることができるngForm
ディレクティブを提供します。これにより、フォームを入れ子にすることができます。これは、ngRepeat
ディレクティブを使用して動的に生成されるフォームでAngular検証ディレクティブを使用する場合に非常に便利です。 ( ソース )
クレイグが言ったように、いいえ。
しかし、についてのあなたのコメントに関して、なぜ:
1 <form>
を入力と「更新」ボタンで使用し、隠し入力を「注文を送信」ボタンと別の<form>
で使用する方が簡単かもしれません。
投稿されたデータを操作できるようにするサーバーサイドのスクリプト言語を使用している場合、この問題を回避するもう1つの方法は、次のようにHTMLフォームを宣言することです。
<form>
<input name="a_name"/>
<input name="a_second_name"/>
<input name="subform[another_name]"/>
<input name="subform[another_second_name]"/>
</form>
投稿されたデータを印刷すると(ここではPHPを使用します)、次のような配列が得られます。
//print_r($_POST) will output :
array(
'a_name' => 'a_name_value',
'a_second_name' => 'a_second_name_value',
'subform' => array(
'another_name' => 'a_name_value',
'another_second_name' => 'another_second_name_value',
),
);
それからあなたはちょうど何かのようにすることができます:
$my_sub_form_data = $_POST['subform'];
unset($_POST['subform']);
あなたの$ _POSTはあなたの "メインフォーム"データのみを持っています、そしてあなたのサブフォームデータはあなたが自由に操作できる他の変数に格納されています。
お役に立てれば!
FORM要素をネストすることはできません。
http://www.w3.org/MarkUp/html3/forms.html
https://www.w3.org/TR/html4/appendix/changes.html#hA.3.9 (html4仕様では、入れ子形式に関する変更はありません) 3.2から4)
https://www.w3.org/TR/html4/appendix/changes.html#hA.1.1.12 (html4仕様では、変更はありません) 4.0から4.1へのネストフォーム
https://www.w3.org/TR/html5-diff/ (html5仕様では、4から5へのネストフォームに関する変更はありません)
https://www.w3.org/TR/html5/forms.html#association-of-controls-and-forms このコメントにコメントする作成者は入れ子になったフォーム要素のサポートの欠如を回避することができます。 "しかし、これが指定されている場所を引用していない、私たちはそれがhtml3仕様で指定されていると仮定すべきだと思います:)
2019年なので、この質問に対する最新の回答をお願いします。入れ子にしなくても入れ子になったフォームと同じ結果を得ることができます。 HTML5はform属性を導入しました。フォームの外にあるフォームコントロールにform属性を追加して、それらを特定のフォーム要素に(idで)リンクすることができます。
https://www.impressivewebs.com/html5-form-attribute/
このようにあなたはこのようにあなたのhtmlを構成することができます:
<form id="main-form" action="/main-action" method="post"></form>
<form id="sub-form" action="/sub-action" method="post"></form>
<div class="main-component">
<input type="text" name="main-property1" form="main-form" />
<input type="text" name="main-property2" form="main-form" />
<div class="sub-component">
<input type="text" name="sub-property1" form="sub-form" />
<input type="text" name="sub-property2" form="sub-form" />
<input type="submit" name="sub-save" value="Save" form="sub-form" />
</div>
<input type="submit" name="main-save" value="Save" form="main-form" />
</div>
Form属性は最近のすべてのブラウザでサポートされています。 IEはこれをサポートしていませんが、IEはブラウザではなくなり、互換性ツールになりました。Microsoft自身によって確認されています。 https://www.zdnet。 com/article /マイクロソフトセキュリティチーフ、すなわちブラウザではないので、デフォルトとしてそのまま使用するのはやめてください/ 。 IEで物事を動かすことを気にするのをやめる時が来た。
https://caniuse.com/#feat=form-attribute
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fae-form
HTMLの仕様から:
この機能により、作成者は入れ子になったフォーム要素のサポートの欠如を回避することができます。
簡単な回避策は、iframeを使って "ネストされた"フォームを保持することです。視覚的にはフォームはネストされていますが、コード側では完全に別のHTMLファイルになっています。
同じブラウザの異なるバージョンで動作させるのに問題があるかもしれません。だからそれを使用しないでください。
1つのブラウザで動作させることができたとしても、それがすべてのブラウザで同じように動作するという保証はありません。そのため、動作させることはできますが、いくつかのを動作させることはできますが、確かに動作させることはできませんすべての時間。
Buttonタグ内でformaction = ""を使用することもできます。
<button type="submit" formaction="/rmDog" method='post' id="rmDog">-</button>
これは別のボタンとして元のフォームにネストされます。
ネストされたフォームに対する解決策は提示しませんが(確実には機能しません)、私には有効な回避策を提示します。
使用シナリオ:N個のアイテムを一度に変更できるスーパーフォーム。下部に[すべて送信]ボタンがあります。各アイテムは、 "Submit Item#N"ボタンを持つそれ自身のネストされたフォームを持ちたいです。しかしできません….
この場合、実際には単一のフォームを使用し、ボタンの名前がsubmit_1
である場合にのみsubmit_N
で終わるパラメーターを調べることで、ボタンの名前を_1
..submit_1
およびsubmitAll
にしてサーバー側で処理できます。 。
<form>
<div id="item1">
<input type="text" name="foo_1" value="23">
<input type="submit" name="submit_1" value="Submit Item #1">
</div>
<div id="item2">
<input type="text" name="foo_2" value="33">
<input type="submit" name="submit_2" value="Submit Item #2">
</div>
<input type="submit" name="submitAll" value="Submit All Items">
</form>
さて、それほど発明ではありませんが、仕事はします。
ネストしたフォームの前に空のフォームタグを使用する
Firefox、Chromeでテストおよび作業済み
I.E.でテストされていません.
<form name="mainForm" action="mainAction">
<form></form>
<form name="subForm" action="subAction">
</form>
</form>
フォームのネスティングについて:私は午後1年間、ajaxスクリプトをデバッグしようとしました。
私の前の答え/例は、HTMLマークアップを説明していませんでした、申し訳ありません。
<form id='form_1' et al>
<input stuff>
<submit onClick='ajaxFunction(That_Puts_form_2_In_The_ajaxContainer)' >
<td id='ajaxContainer></td>
</form>
form_2が常に無効なform_2を言って失敗しました。
Form_1のform_2 <i>outside</i>
を生成するajaxContainerを動かしたとき、私は仕事に戻りました。それは、なぜ形を入れ子にすることができるのかという疑問に対する答えです。実際には、どのフォームを使用するかを定義しない場合のIDは何ですか?より良い、よりスリムな回避策があるはずです。
本当に不可能です...私はフォームタグをネストすることができませんでした...しかし私はこのコードを使いました:
<form>
OTHER FORM STUFF
<div novalidate role="form" method="post" id="fake_form_id_0" data-url="YOUR_POST_URL">
THIS FORM STUFF
</div>
</form>
{% csrf_token %}
とかを使って
そしていくつかのJSを適用した
var url = $(form_id).attr("data-url");
$.ajax({
url: url,
"type": "POST",
"data": {
'csrfmiddlewaretoken': '{{ csrf_token }}',
'custom-param-attachment': 'value'
},
success: function (e, data) {
if (e.is_valid) {
DO STUFF
}
}
});
質問はかなり古く、私は@everyoneに同意しますが、HTMLではフォームのネストはできません。
しかし、これはすべてこれを見たいと思うかもしれません
ブラウザがネストされたフォームを持つことができるようにするためにあなたがハックできるところ(私はこれをハックと呼んでいます。
<form id="form_one" action="http://Apple.com">
<div>
<div>
<form id="form_two" action="/">
<!-- DUMMY FORM TO ALLOW BROWSER TO ACCEPT NESTED FORM -->
</form>
</div>
<br/>
<div>
<form id="form_three" action="http://www.linuxtopia.org/">
<input type='submit' value='LINUX TOPIA'/>
</form>
</div>
<br/>
<div>
<form id="form_four" action="http://bing.com">
<input type='submit' value='BING'/>
</form>
</div>
<br/>
<input type='submit' value='Apple'/>
</div>
</form>
JSフィドルリンク