你可以嵌套的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 :
- 表单属性在HTML5中是新的。
- 指定元素所属的表单元素。 此属性的值必须是同一文档中元素的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中。
希望这可以帮助!
请注意,您不能嵌套FORM元素!
http://www.w3.org/MarkUp/html3/forms.html
https://www.w3.org/TR/html4/appendix/changes.html#hA.3.9(html4规范注意到嵌套forms从3.2到4没有变化);
https://www.w3.org/TR/html4/appendix/changes.html#hA.1.1.12(html4规范注意到嵌套forms从4.0到4.1没有改变);
https://www.w3.org/TR/html5-diff/(html5规范注意到嵌套forms从4到5没有变化);
https://www.w3.org/TR/html5/forms.html#association-of-controls-and-forms comments to“这个特性允许作者解决对嵌套表单元素缺乏支持”,但是不是引用的地方,我认为他们假设我们应该假设它是在html3规范中指定的:)
一个简单的解决方法是使用一个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_N
并submitAll
并处理它的服务器端,只查看以_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
今天,我也陷入了同样的问题,并解决了我添加了用户控件的问题
在这个控制我使用这个代码
<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); }
我相信这会有所帮助。