你可以嵌套的HTML表单?

是否有可能像这样嵌套的HTML表单

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

所以这两个表格工作? 我的朋友有这个问题,子subForm的一部分工作,而另一部分则没有。

总之,没有。 您可以在一个页面中有几个表单,但不应该嵌套。

从html5的工作草案 :

4.10.3 form元素

内容模型:

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

第二种forms将被忽略,请参阅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; } 

纯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(); 

整个forms

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

或干脆

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

如果你使用的是AngularJS,你的ng-app里面的任何<form>标签在运行时会被devise为嵌套的ngForm指令replace。

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

我遇到了一个类似的问题,我知道这不是问题的答案,但它可以帮助有这种问题的人:
如果需要将两个或更多个表单的元素放在给定的序列中,那么HTML5 <input> form属性可以是解决scheme。

http://www.w3schools.com/tags/att_input_form.asp

  1. 表单属性在HTML5中是新的。
  2. 指定元素所属的表单元素。 此属性的值必须是同一文档中元素的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" /> 

注意form属性在任何版本的Internet Explorer和Edge中都不起作用。

正如克雷格所说,不。

但是,关于你的评论, 为什么

将1 <form>与input和“更新”button一起使用可能更容易,并且在另一个<form>使用带有“Submit Order”button的复制隐藏input。

解决这个问题的另一种方法是,如果你使用了一些服务器端脚本语言,允许你操作发布的数据,就是声明你的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现在只有您的“主窗体”数据,并且您的子窗体数据存储在您可以随意操作的另一个variables中。

希望这可以帮助!

一个简单的解决方法是使用一个iframe来保存“嵌套”的forms。 可视化的forms是嵌套的,但在代码方面,它在一个单独的html文件中。

即使您可以在一个浏览器中使用它,也不能保证它在所有浏览器中都能正常工作。 所以,虽然你可能能够在一段时间内使用它,但你肯定无法一直工作。

您甚至会遇到问题,使其在同一浏览器的不同版本中工作。 所以避免使用。

关于嵌套表单:我花了10年的时间尝试debugging一个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 <i>outside</i> form <i>outside</i>的ajaxContainer时,我重新开始工作。 这就是为什么人们可以嵌套forms的问题。 我的意思是,如果不定义使用哪种forms,那么ID是什么? 必须有一个更好,更轻松的工作。

虽然我没有提出解决scheme嵌套窗体(它不能可靠地工作),我提出了一个解决方法,适用于我:

用法场景:允许一次更改N个项目的超级forms。 它的底部有一个“全部提交”button。 每个项目都希望有一个“Submit Item#N”button的嵌套表单。 但不能…

在这种情况下,实际上可以使用单个表单,然后使button的名称为submit_1 .. submit_NsubmitAll并处理它的服务器端,只查看以_1结尾的参数(如果button的名称是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> 

好吧,发明并不多,但它是做这个工作的。

在嵌套表单之前使用空的表单标记

testing和工作在Firefox,Chrome

没有testing在IE浏览器

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

虽然这个问题是相当古老的,我同意@everyone表单的嵌套不允许在HTML中

但这个东西都可能想看到这一点

你可以破解(我称之为黑客,因为我确定这是不合法的)HTML允许浏览器具有嵌套的forms

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

今天,我也陷入了同样的问题,并解决了我添加了用户控件的问题
在这个控制我使用这个代码

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

我相信这会有所帮助。