您可以嵌套html表单吗?


451

是否可以嵌套这样的html表单

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

这样两种形式都起作用?我的朋友对此有问题,部分subForm作品没有问题。


他正在设置一个购物车,其中更新数量在跟踪总计的表格内。我个人不会这样做,但是他遇到了使它无法正常工作的问题。
李维

1
似乎他最好使用Javascript将值从一种形式复制到另一种形式,而不是尝试嵌套它们。我认为嵌套不会起作用。

15
旧的问题,但要回答评论,嵌套形式可能是避免JavaScript所必需的。之所以遇到这种情况,是因为我想为不需要“启用” JavaScript的子表单“重置”按钮嵌套表单。
vol7ron 2011年


Answers:


459

一言以蔽之。您可以在页面中使用多种形式,但不应嵌套它们。

html5工作草案中

4.10.3 form元素

内容模型:

流内容,但没有表单元素后代。


126
我同意答案,但要再问一个,为什么不呢?为什么HTML不允许嵌套表格?对我来说,这似乎是一种局限,如果没有的话,我们会更好。在许多示例中,使用嵌套表单更容易编程(即,将上传照片表单与个人资料编辑表单一起使用)。
瑞安

20
@Nilzor,他不是在问是否不能完成,而是在问为什么。我同意; 嵌套表单实际上非常有用。因此,如果您有一个带有选项卡的一页应用程序,则每个选项卡都是其自己的表单(以便您可以提交以保存进度),并且它们都包裹在一个表单中,您可以提交以保存所有内容。我感觉合理。
罗伯·格兰特

5
我同意别人所说的。这种限制似乎是武断且有害的。
aroth 2014年

12
因此,我们需要带有嵌套表单的HTML 5.1。
赫克托

3
嵌套表单的问题在于HTML内的表单体系结构,该表单内的操作会导致Submit事件。这个问题使人毛骨悚然,需要提交什么。您可能在一个表单中有多个字段,或者在一个div中有多个表单,但是在表单中包含表单确实没有任何意义。如果内容融合在一起,那便是一种形式。如果内容是分别提交的,则实际上是单独的表单,不需要外部表单。
凯尔·贝克

96

我遇到了类似的问题,但我知道这不是问题的答案,但对于有这种问题的人可能会有所帮助:
是否需要将两种或多种形式的元素按给定顺序放置,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

1
只是指向浏览器支持表:caniuse.com/#feat=form-attribute 恢复-它可在除IE(包括最新的v11)之外的任何地方(Chrome,Firefox,Opera,Egde,Safari,Android浏览器...)使用。
dmikam

@ cliff-burton,这有什么区别?我只是可以在表格之外看到输入。仍然需要JS同时提交两种形式。不是吗
sdlins

嗯,距离我上次使用它已经很长时间了,但是我认为提交表单不需要JS。假设<input type="submit"与链接的<form>指定了action,则将在该请求中使用与该<input />链接链接的(s)<form>
Cliff Burton

90

第二种形式将被忽略,例如,请参见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();

对于第2类,您可以

$(".class2").serialize();

对于整个表格

$("#formid").serialize();

或简单地

$("#formid").submit();

31

如果您使用的是AngularJS,则其中的任何<form>标签ng-app在运行时ngForm都会被设计为嵌套的指令替换。

在Angular形式中可以嵌套。这意味着外部形式在所有子形式都有效时也有效。但是,浏览器不允许嵌套<form>元素,因此Angular提供的ngForm行为与<form>嵌套但可以嵌套的指令相同。这使您可以拥有嵌套的表单,这在使用Angular验证伪指令动态生成的表单中非常有用ngRepeat。(来源


这就是我一直在寻找的答案:)是的,嵌套表格确实很有意义,因为如果您有多个选项卡,但只想在一个选项卡上执行验证,则可以使用嵌套表格来进行验证。
NeverGiveUp161 '18

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浏览器因此停止使用它作为您的默认值/。现在该是我们停止关心使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。
创作

如果您只想触发一种其他形式,可以。但是,当您需要触发“父项”时,它将如何解决?形式它的子形式,因为它是一个,没有js?
sdlins

@sdlins并不是这个问题。问题是大约2种不同的形式,但有嵌套的形式。我想知道为什么您要有2个表单但仍然有1个提交功能?那么,您不能只提供1个表格吗?实际上,您确实必须借助javascript这样奇怪的东西:P
Creative

是的,您是对的,这不是OP的问题。我会发布我自己的。谢谢!
sdlins

12

解决此问题的另一种方法,如果您使用某种服务器端脚本语言来允许您处理所发布的数据,则可以这样声明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

正如克雷格所说,不。

但是,对于以您的评论为什么

将1 <form>与输入和“更新”按钮一起使用可能更容易,而将复制隐藏的输入与另一个“提交订单”按钮一起使用,则更容易<form>


我将购物车页面做成这样,他只是采用了另一种方式,不想更改它。我也不满意他的方法是否同样有效。
李维

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
我不知道您为什么要发布已经回答了三年半的问题,但是更多的问题是链接到HTML3,这已经不是很长一段时间的建议了。
Aidiakapi 2013年

7
它指的是基本问题已经回答了多长时间,我认为这是建设性的。我还发现了没有节拍的“请注意,您不能嵌套FORM元素!” 在规范内要幽默。
马克·彼得森

1
这是一个问题,因为我必须插入作为表单的API,并且因为.net应用程序(将<form>标记包装在所有内容周围)。您如何克服这个问题。
2014年

4

一个简单的解决方法是使用iframe容纳“嵌套”表单。从视觉上看,表单是嵌套的,但在代码方面,它完全位于单独的html文件中。


1
iframe的时间到了
穆罕默德·泰雅布

3

您还可以在button标记内使用formaction =“”。

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

这将以原始形式嵌套为单独的按钮。


这并不能回答问题,但这只是帮助我解决了我不得不放弃
投票的

忽略上面的内容(5分钟后不会让我编辑...嗯)。巨大的帮助-准确地映射到我今天早上试图做的事情。这就是为什么我们都如此爱
codeAndStuff

2

即使您可以在一个浏览器中使用它,也无法保证它在所有浏览器中都可以使用。因此,尽管你也许能得到它的工作一定的时间,你肯定无法得到它的工作的所有的时间。


2

您甚至可能无法在同一浏览器的不同版本中使用它。所以避免使用它。


2

虽然我没有提出嵌套表单的解决方案(它不能可靠地工作),但我还是提出了一种对我有用的解决方法:

使用场景:允许一次更改N个项目的超级表单。它的底部有一个“全部提交”按钮。每个项目都希望有一个带有“提交项目#N”按钮的嵌套表单。但是不能

在这种情况下,实际上可以使用一种形式,然后使按钮的名称为submit_1.. submit_NsubmitAll在服务器端进行处理,方法是仅查看_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

关于嵌套表单:我花了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 <i>outside</i>的form_2的ajaxContainer时,我又重新营业了。它回答了有关为什么可能嵌套表格的问题。我的意思是,如果不定义要使用的表单,那么ID是什么?必须有更好,更流畅的解决方法。


1

在嵌套表单之前使用空表单标签

在Firefox,Chrome上测试和工作

未在IE上测试

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

当我在chrome上尝试此操作时,它会输出<form name =“ mainForm”> </ form> <form name =“ subForm”> </ form>
ianace

1
您是否尝试过使用提交按钮。我已经使用过这种方法很多次了,并且一直有效。
法提赫

10
这违反了规范,使用它会导致将来出现问题。
Oskar Berggren

较新的Webkit版本仅删除了嵌套的表单元素。
woens

0

尽管这个问题已经很老了,我也同意@everyone的观点,HTML中不允许嵌套表格

但这件事所有人可能都希望看到

您可以在哪里hack(我称它为hack,因为我确信这是不合法的)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链接

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


0

不,您不能拥有嵌套表格。相反,您可以打开一个包含表单的Modal并执行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,以解析要采取的正确操作。直到我尝试将一个字段附加到其中一个按钮上,Validate都抱怨了,才打破。解开它没什么大不了的-我在外部表单上使用了显式字符串化,因此提交和表单不匹配无关紧要。是的,应该将按钮从提交提交到onclick。

关键是在某些情况下它没有被完全破坏。但是“不完全坏掉”可能太低了,无法拍摄:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.