是否可以嵌套这样的html表单
<form name="mainForm">
<form name="subForm">
</form>
</form>
这样两种形式都起作用?我的朋友对此有问题,部分subForm
作品没有问题。
是否可以嵌套这样的html表单
<form name="mainForm">
<form name="subForm">
</form>
</form>
这样两种形式都起作用?我的朋友对此有问题,部分subForm
作品没有问题。
Answers:
我遇到了类似的问题,但我知道这不是问题的答案,但对于有这种问题的人可能会有所帮助:
是否需要将两种或多种形式的元素按给定顺序放置,HTML5 <input> form
属性可以解决。
从http://www.w3schools.com/tags/att_input_form.asp:
- form 属性是HTML5中的新增功能。
- 指定元素所属
<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" />
在这里,您将找到浏览器的兼容性。
<input type="submit"
与链接的<form>
指定了action
,则将在该请求中使用与该<input />
链接链接的(s)<form>
第二种形式将被忽略,例如,请参见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();
对于第2类,您可以
$(".class2").serialize();
对于整个表格
$("#formid").serialize();
或简单地
$("#formid").submit();
如果您使用的是AngularJS,则其中的任何<form>
标签ng-app
在运行时ngForm
都会被设计为嵌套的指令替换。
在Angular形式中可以嵌套。这意味着外部形式在所有子形式都有效时也有效。但是,浏览器不允许嵌套
<form>
元素,因此Angular提供的ngForm
行为与<form>
嵌套但可以嵌套的指令相同。这使您可以拥有嵌套的表单,这在使用Angular验证伪指令动态生成的表单中非常有用ngRepeat
。(来源)
由于是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规范:
此功能使作者可以解决缺少对嵌套表单元素的支持的问题。
解决此问题的另一种方法,如果您使用某种服务器端脚本语言来允许您处理所发布的数据,则可以这样声明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规范中指定的:)
您还可以在button标记内使用formaction =“”。
<button type="submit" formaction="/rmDog" method='post' id="rmDog">-</button>
这将以原始形式嵌套为单独的按钮。
虽然我没有提出嵌套表单的解决方案(它不能可靠地工作),但我还是提出了一种对我有用的解决方法:
使用场景:允许一次更改N个项目的超级表单。它的底部有一个“全部提交”按钮。每个项目都希望有一个带有“提交项目#N”按钮的嵌套表单。但是不能
在这种情况下,实际上可以使用一种形式,然后使按钮的名称为submit_1
.. submit_N
并submitAll
在服务器端进行处理,方法是仅查看_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>
好的,虽然发明不多,但可以完成工作。
关于嵌套表单:我花了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是什么?必须有更好,更流畅的解决方法。
在嵌套表单之前使用空表单标签
在Firefox,Chrome上测试和工作
未在IE上测试
<form name="mainForm" action="mainAction">
<form></form>
<form name="subForm" action="subAction">
</form>
</form>
尽管这个问题已经很老了,我也同意@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链接
不,您不能拥有嵌套表格。相反,您可以打开一个包含表单的Modal并执行Ajax表单提交。
真的不可能...我无法嵌套表单标签...但是我使用了以下代码:
<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
}
}
});
今天,我也陷入了同样的问题,并解决了我添加了用户控件的问题,并
在此控件上使用了以下代码
<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);
}
我相信这会有所帮助。