HTMLフォームをネストできますか?


451

このようなhtmlフォームをネストすることは可能ですか?

<form name="mainForm">
  <form name="subForm">
  </form>
</form>

両方のフォームが機能するように?私の友人はこれに問題を抱えています、subFormそれは作品の一部ですが、別の部分はそうではありません。


彼はカートをセットアップしています。更新数量は、合計を追跡するフォーム内にあります。私は個人的にはそうしませんが、彼はそれを機能させるのに問題を抱えています。
Levi

1
ネストするのではなく、Javascriptを使用して1つのフォームから別のフォームに値をコピーした方がよいようです。ネスティングはうまくいかないと思います。
ベン

15
古い質問ですが、コメントに答えるために、JavaScriptを回避するためにフォームのネストが必要になる場合があります。JavaScriptを有効にする必要がないサブフォームの「リセット」ボタンのフォームをネストしたいので、これに遭遇しました。
vol7ron


回答:


459

つまり、いいえ。1つのページに複数のフォームを含めることができますが、それらをネストすることはできません。

HTML5のワーキングドラフト

4.10.3 form要素

コンテンツモデル:

フローコンテンツですが、フォーム要素の子孫はありません。


126
私は答えに同意しますが、別の質問をするために、なぜでしょうか?HTMLがフォームのネストを許可しないのはなぜですか?私には、それがなければより良い結果が得られる制限だと思われます。ネストされたフォームを使用するとプログラミングが簡単になる多くの例があります(つまり、プロファイル編集フォームでアップロード写真フォームを使用します)。
ライアン

20
@Nilzor彼はそれができないかどうか尋ねていません、なぜそうしないのかと尋ねています。同意する; フォームをネストすることは実際にとても便利です。したがって、タブ付きの1ページアプリがある場合、各タブは独自のフォームであり(送信して進行状況を保存できます)、すべてフォームにラップされ、送信してすべてを保存できます。私には理にかなっています。
Rob Grant、

5
他の人が言ったことに同意します。この制限は恣意的で有害なようです。
aroth

12
したがって、フォームがネストされたHTML 5.1が必要です。
ヘクター

3
ネストされたフォームの問題は、HTML内のフォームアーキテクチャであり、そのフォーム内のアクションが送信イベントにつながります。質問は、何を提出する必要があるかについての理解を深めます。フォーム内に複数のフィールドがある場合や、div内に複数のフォームがある場合がありますが、フォーム内にフォームがあることは実際には意味がありません。コンテンツが一緒になると、すべて1つの形式になります。コンテンツが個別に送信される場合、それは実際には外部フォームを必要としない個別のフォームです。
カイルベイカー

96

私は同様の問題に遭遇しました、そしてそれが質問への答えではないことを知っています、しかしそれはこの種の問題を持つ誰かにとって助けになるかもしれません:
2つ以上のフォームの要素を与えられたシーケンスに置く必要がある場合、HTML5 <input> form属性がソリューションになります。http://www.w3schools.com/tags/att_input_form.asp

から:

  1. form 属性はHTML5の新機能です。
  2. 要素が属する<form>要素を指定<input>します。この属性の値は<form>、同じドキュメント内の要素のid属性でなければなりません。

シナリオ

  • input_Form1_n1
  • input_Form2_n1
  • input_Form1_n2
  • input_Form2_n2

実装

<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" />

ここでは、ブラウザの互換性を確認できます。


1
それは素晴らしい作品です!受け入れられた回答に含める必要があります
Nahouto 2018年

1
ブラウザーサポートテーブルを参照するだけです:caniuse.com/#feat=form-attribute 再開-IEを除くすべての場所(Chrome、Firefox、Opera、Egde、Safari、Androidブラウザー...)で動作します(最新のv11を含む) 。
dmikam 2018

@ cliff-burton、ここの違いは何ですか?フォームの外にある入力だけが表示されます。それでも、JSが両方のフォームを同時に送信する必要があります。ね?
sdlins

ええと、前回使ってから久しぶりですが、フォームの提出にJSは必要ないと思います。ことを条件とする<input type="submit"、そのにリンクされている<form>指定しaction<input />同じに連結された(単数または複数)は<form>、その要求に使用される
クリフ・バートン

90

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;
}

43

プレーン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();

31

AngularJSを使用している場合、<form>内部のタグng-appは実行時ngFormに入れ子に設計されたディレクティブに置き換えられます。

Angularフォームでは入れ子にすることができます。これは、すべての子フォームも有効である場合、外側のフォームも有効であることを意味します。ただし、ブラウザは<form>要素のネストを許可しないため、AngularはngForm同じように動作<form>するがネストできるディレクティブを提供します。これにより、フォームをネストすることができます。これは、ngRepeatディレクティブを使用して動的に生成されるフォームでAngular検証ディレクティブを使用する場合に非常に役立ちます。(ソース


これが私が探していた答えでした:)そして、はい、フォームをネストすることは理にかなっています。なぜなら、複数のタブがあり、1つのタブだけで検証を実行したい場合、ネストされたフォームでそれを行うことができるからです。
NeverGiveUp161

Webコンポーネントでも同じですか?
Gangadhar JANNU

31

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/microsoft-security-chief-ie-is-not-a -browser-so-stop-using-it-as-your-default /。そろそろIEで物事を機能させることについて気にするのをやめる時が来ました。

https://caniuse.com/#feat=form-attribute
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fae-form

HTML仕様から:

この機能により、作成者はフォーム要素のネストがサポートされていない状態を回避できます。


ここの違いは何ですか?フォームの外にある入力だけが表示されます。それでも、JSが両方のフォームを同時に送信する必要があります。ね?
sdlins

@sdlinsいいえ、アイデアはメインコンポーネントとサブコンポーネントのスタイルを入れ子にしたいようにスタイルを設定することです。実際の2つのフォームタグは非表示になります。各送信ボタンは、それぞれのフォーム送信をトリガーします。JavaScriptは必要ありません。
クリエイティブ

1つまたは他のフォームのみをトリガーする場合は、わかりました。しかし、「親」をトリガーする必要がある場合、どのように解決しますか。それが1つであり、jsなしであるのでその子フォームを持つフォーム?
sdlins

@sdlinsそれはこの質問についてではありません。問題は2つの異なるフォームについてですが、それらを入れ子にします。なぜ2つのフォームが必要なのに1つの送信関数が必要なのかと思いますか。では、1つのフォームしか持てませんか?あなたは確かにそのような奇妙な何かのためにjavascriptに頼らなければならないでしょう:P
クリエイティブ

ええ、あなたは正しいです、それはOPの質問ではありません。自分で投稿します。ありがとうございました!
sdlins

12

この問題を回避するもう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には「メインフォーム」データのみが含まれ、サブフォームデータは、自由に操作できる別の変数に格納されます。

お役に立てれば!


11

クレイグが言ったように、違います。

しかし、理由についてのあなたのコメントに関して

<form>入力と[更新]ボタンで1を使用し、別のの[注文を送信]ボタンで非表示の入力をコピーする方が簡単な場合があります<form>


私はそのように私のカートページを作りました、彼はちょうど別の方法で行き、それを変えたくありませんでした。彼の方法がそれほど有効だったとしても、私は前向きではなかった。
Levi

9

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仕様で指定されていると想定すべきだと彼らは想定していると思います:)


23
3年半答えられた質問になぜ投稿するのかわかりませんが、長い間推奨されていなかったHTML3にリンクすることはさらに問題があります。
アイディアカピ2013

7
これは、根本的な質問に対する回答がどれくらいあったかを示すものであり、私は建設的であると信じていました。また、タクトフリーの「FORM要素をネストすることはできません!」ユーモラスな仕様の範囲内。
Mark Peterson

1
これは問題です。フォームであるAPIを挿入する必要があり、.netアプリ(すべてを<form>タグで囲む)だからです。この問題をどのように克服しますか。
jelly46 2014年

4

簡単な回避策は、iframeを使用して「ネストされた」フォームを保持することです。視覚的にはフォームはネストされていますが、コード側では完全に別のhtmlファイルにあります。


1
iframeのタイムアップ
muhammad tayyab

3

buttonタグ内でformaction = ""を使用することもできます。

<button type="submit" formaction="/rmDog" method='post' id="rmDog">-</button>

これは別のボタンとして元のフォームにネストされます。


これは質問の答えにはなりませんが、これは私が非常に
賛成し

上記を無視します(5分後に編集できません...うーん)。ここで大きな助け-私が今朝やろうとしていたことを正確にマッピングしました。これが私たち全員がSOを愛する理由です
codeAndStuff 2018年

2

1つのブラウザーで機能するようにできたとしても、すべてのブラウザーで同じように機能するという保証はありません。あなたはそれが仕事を得ることができるかもしれませんしながら、だから、いくつかの時間を、あなたは確かにそれが仕事を得ることができないだろう、すべての時間のを。


2

同じブラウザーの異なるバージョンで機能させるのに問題が発生することもあります。したがって、それを使用しないでください。


2

入れ子になったフォームの解決策は提示しませんが(確実に機能しない)、私にとっては有効な回避策を提示します。

使用シナリオ:Nアイテムを一度に変更できるスーパーフォーム。下部に[すべて送信]ボタンがあります。各項目は、「Submit Item#N」ボタンを使用して独自のネストされたフォームを持ちたいと考えています。しかし、できません...

この場合、1は、実際には単一のフォームを使用して、ボタンの名前があることができsubmit_1... submit_NsubmitAllだけで終わるのparamsを見ることで、サーバ側にし、それを処理_1ボタンの名前ですかsubmit_1

<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>

わかりました、それほど発明ではありませんが、それは仕事をします。


1

フォームのネストについて:私は1日の午後に10年かけて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を生成するajaxContainerを移動したとき<i>outside</i>、私は仕事に戻っていました。なぜフォームをネストするのかという疑問に対する答えです。つまり、実際には、使用するフォームを定義しない場合のIDは何ですか?より良い、よりスマートな回避策が必要です。


1

ネストされたフォームの前に空のフォームタグを使用する

Firefox、Chromeでテストおよび動作

IEでテストされていません

<form name="mainForm" action="mainAction">
  <form></form>
  <form name="subForm"  action="subAction">
  </form>
</form>

私がこれをクロムで試したとき、それはこの<form name = "mainForm"> </ form> <form name = "subForm"> </ form>を出力します
ianace

1
送信ボタンで試しましたか?私はこの方法を何度も使用しており、常に機能しています。
Fatih

10
これは仕様の違反であり、それを使用すると将来の問題が発生します。
Oskar Berggren

新しいWebkitバージョンは、ネストされたフォーム要素を削除するだけです。
2018

0

質問はかなり古く、フォームのネストはHTMLでは許可されていないという@全員に同意しますが

しかし、これは誰もがこれを見たいと思うかもしれません

あなたがハッキングできる場所(私はこれをハックと呼んでいるので、これは正当ではないと確信しています)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 FIDDLE LINK

http://jsfiddle.net/nzkEw/10/


0

いいえ、フォームをネストすることはできません。代わりに、フォームを含むモーダルを開いて、Ajaxフォーム送信を実行できます。


0

本当に不可能です...フォームタグをネストできませんでした...しかし、私はこのコードを使用しました:

<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
      }
  }
});

-1

今日、私も同じ問題で行き詰まり、ユーザーコントロールを追加した問題を解決し、
このコントロールでこのコードを使用します

<div class="divformTagEx">

</div>

<asp:Literal runat="server" ID="litFormTag" Visible="false">
'<div> <form  style="margin-bottom: 3;" action="http://login.php" method="post" name="testformtag"></form> </div>'</asp:Literal>

ページのPreRenderCompleteイベントでこのメソッドを呼び出します

private void InitializeJavaScript()
{
        var script = new StringBuilder();
        script.Append("$(document).ready(function () {");
        script.Append("$('.divformTagEx').append( ");
        script.Append(litFormTag.Text);
        script.Append(" )");
        script.Append(" });");
        ScriptManager.RegisterStartupScript(this, GetType(), "nestedFormTagEx", script.ToString(), true);
    }

これは役立つと思います。


-1

私がこれを行うべきではないと気付く前に、複数の送信ボタンを持つためにフォームをネストしていました。その方法で18か月間、数千のサインアップトランザクションを実行しましたが、誰も問題について電話していませんでした。

ネストされたフォームにより、正しいアクションを実行するために解析するIDが提供されました。ボタンの1つにフィールドをアタッチしようとして、Validateが文句を言うまでは壊れませんでした。もつれを解くのは大したことではありませんでした。外部フォームで明示的な文字列化を使用したので、送信やフォームが一致しなくてもかまいません。ええ、そう、ボタンを送信からオンクリックに移すべきだった。

ポイントは、それが完全に壊れていない状況があることです。しかし、「完全に壊れているわけではない」というのは、おそらく標準としては低すぎて、:-)を狙うことができない

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.