你能嵌套html表单吗?

你能嵌套html表单吗?,html,nested-forms,Html,Nested Forms,可以这样嵌套html表单吗 <form name="mainForm"> <form name="subForm"> </form> </form> 这两种形式都有效吗?我的朋友对此有问题,子表单的一部分工作,而另一部分不工作。总之,不可以。一个页面中可以有多个表单,但它们不应该嵌套 从: 4.10.3表单元素 内容模型: 流动内容,但不包含表单元素子体 总之,不可以。一个页面中可以有多个表单,但它们不应该嵌套 从: 4.10.3表单

可以这样嵌套html表单吗

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


这两种形式都有效吗?我的朋友对此有问题,
子表单
的一部分工作,而另一部分不工作。

总之,不可以。一个页面中可以有多个表单,但它们不应该嵌套

从:

4.10.3
表单
元素

内容模型:

流动内容,但不包含表单元素子体


总之,不可以。一个页面中可以有多个表单,但它们不应该嵌套

从:

4.10.3
表单
元素

内容模型:

流动内容,但不包含表单元素子体

正如克雷格所说,没有

但是,关于您对原因的评论:

使用1
和输入以及“更新”按钮可能更容易,使用复制隐藏输入和另一个

中的“提交订单”按钮可能更容易,正如Craig所说,不

但是,关于您对原因的评论:


将1
与输入和“更新”按钮一起使用可能更容易,在另一个

浏览器中使用复制隐藏输入和“提交顺序”按钮可能更容易,即使您可以让它在一个浏览器中工作,也不能保证它在所有浏览器中都能工作。因此,虽然您可能可以让它在某些时候工作,但您肯定不能让它一直工作。

即使您可以让它在一个浏览器中工作,也不能保证它在所有浏览器中都工作相同。因此,虽然您可能可以让它在某些时间工作,但您肯定不能让它一直工作。

第二个表单将被忽略,请参阅来自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;
}
bool HTMLParser::formCreateErrorCheck(令牌*t、RefPtr和结果)
{
//只有当我们还没有在表单中时,才创建一个新表单。
//这与其他浏览器的行为一致。
if(!m_currentFormElement){
m_currentFormElement=新的HTMLFormElement(formTag,m_文档);
结果=m_currentFormElement;
pCloserCreateErrorCheck(t,结果);
}
返回false;
}

第二个表单将被忽略,请参见来自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;
}
bool HTMLParser::formCreateErrorCheck(令牌*t、RefPtr和结果)
{
//只有当我们还没有在表单中时,才创建一个新表单。
//这与其他浏览器的行为一致。
if(!m_currentFormElement){
m_currentFormElement=新的HTMLFormElement(formTag,m_文档);
结果=m_currentFormElement;
pCloserCreateErrorCheck(t,结果);
}
返回false;
}
注意:不允许嵌套表单元素

(html4规范注意到嵌套形式从3.2到4没有变化)

(html4规范注意到嵌套表单从4.0到4.1没有变化)

(html5规范注意到嵌套形式从4到5没有变化)

对“此功能允许作者解决对嵌套表单元素缺乏支持的问题”的评论,但没有提到在何处指定此功能,我认为他们假设我们应该假设它在html3规范中指定:)

注意:不允许嵌套表单元素

(html4规范注意到嵌套形式从3.2到4没有变化)

(html4规范注意到嵌套表单从4.0到4.1没有变化)

(html5规范注意到嵌套形式从4到5没有变化)


对“此功能允许作者解决对嵌套表单元素缺乏支持的问题”的评论,但没有提到这是在哪里指定的,我认为他们假设我们应该假设它是在html3规范中指定的:)

关于嵌套表单:我花了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>


关于嵌套表单:有一天下午,我花了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>


普通html不允许您这样做。但是使用javascript您可以做到这一点。 如果您使用的是javascript/jquery,则可以使用类对表单元素进行分类,然后使用serialize()仅序列化要提交的项目子集的表单元素

<form id="formid">
    <input type="text" class="class1" />
    <input type="text" class="class2">
</form>
对于2班,你可以这样做

$(".class2").serialize();
整个表格

$("#formid").serialize();
或者干脆

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

普通html不允许您这样做。但是使用javascript您可以做到这一点。 如果您使用的是javascript/jquery,则可以使用类对表单元素进行分类,然后使用serialize()仅序列化要提交的项目子集的表单元素

<form id="formid">
    <input type="text" class="class1" />
    <input type="text" class="class2">
</form>
对于2班,你可以这样做

$(".class2").serialize();
整个表格

$("#formid").serialize();
或者干脆

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

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

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

今天,我也遇到了同样的问题,并解决了这个问题,我添加了一个用户控件和
在这个控件上,我使用这个代码

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

我相信这会有帮助。

今天,我也遇到了同样的问题,并解决了这个问题,我添加了一个用户控件和
在这个控件上,我使用这个代码

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

我相信这会有所帮助。

另一种解决此问题的方法是,如果您使用允许您操作发布数据的服务器端脚本语言,则如下所示声明html表单:

<form>
<input name="a_name"/>
<input name="a_second_name"/>
<input name="subform[another_name]"/>
<input name="subform[another_second_name]"/>
</form>
//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']);
您的$\u帖子现在只有“主窗体”数据,而您的子窗体数据存储在另一个窗体中
<button type="submit" formaction="/rmDog" method='post' id="rmDog">-</button>
<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>
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
      }
  }
});
<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>