Consegue aninhar formulários html?

é possível aninhar formas html como esta

<form name="mainForm">
  <form name="subForm">
  </form>
</form>
Para que ambas as formas funcionem? Meu amigo está tendo problemas com isso, uma parte dos trabalhos subForm, enquanto outra parte não.

Author: Mark Garcia, 2008-12-19

19 answers

Numa palavra, não. Você pode ter vários formulários em uma página, mas eles não devem ser aninhados.

Do projecto de trabalho do html5:

4.10.3 o elemento form

Modelo de conteúdo:

Conteúdo de fluxo, mas sem descendentes de elementos de forma.

 407
Author: Craig, 2016-02-08 16:34:19

O segundo formulário será ignorado, veja o excerto do WebKit por exemplo:

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;
}
 84
Author: Vitalii Fedorenko, 2012-02-15 13:57:19
Encontrei um problema semelhante, e sei que não é uma resposta à pergunta,mas pode ajudar alguém com este tipo de problema. se for necessário colocar os elementos de duas ou mais formas numa dada sequência, o HTML5 <input> form atributo pode ser a solução.

De http://www.w3schools.com/tags/att_input_form.asp:
  1. o atributo form é novo em HTML5.
  2. especifica qual <form> Elemento an <input> o elemento pertence a. O valor deste atributo deve ser o atributo id de um elemento <form> no mesmo documento.

Cenário:

  • input_Form1_n1
  • input_Form2_n1
  • input_Form1_n2
  • input_Form2_n2

Execução:

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

Aqui vai encontrar a compatibilidade do browser.

 49
Author: Cliff Burton, 2018-08-01 12:18:51

O HTML simples não lhe permite fazer isto. Mas com javascript você pode ser capaz de fazer isso. Se você estiver usando javascript / jquery você pode classificar seus elementos de forma com uma classe e então usar serialize() para serializar apenas aqueles elementos de forma para o subconjunto dos itens que você deseja enviar.

<form id="formid">
    <input type="text" class="class1" />
    <input type="text" class="class2">
</form>

Então no seu javascript você poderia fazer isso para serializar elementos da classe 1

$(".class1").serialize();

Para a classe 2 você poderia fazer

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

Para todo o formulário

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

Ou simplesmente

$("#formid").submit();
 41
Author: user2420019, 2017-08-14 22:07:01

Se estiver a usar AngularJS, quaisquer {[[0]} marcas dentro do seu ng-app são substituídas no tempo de execução por ngForm directivas que são concebidas para serem aninhadas.

Em formas angulares podem ser aninhadas. Isto significa que a forma exterior é válida quando todas as formas infantis são válidas também. No entanto, os navegadores não permitem o aninhamento de <form> elementos, por isso o Angular fornece a Directiva ngForm que se comporta de forma idêntica a <form> mas pode ser aninhada. Isto permite-lhe ter formas aninhadas, o que é muito útil ao utilizar directivas de validação Angular em formas que são geradas dinamicamente utilizando a Directiva ngRepeat. (Fonte)

 28
Author: roufamatic, 2016-01-19 23:32:32
Como o Craig disse, Não.

Mas, em relação ao seu comentário sobre porquê:

Pode ser mais fácil usar 1 <form> com as entradas e o botão "Actualizar", e usar a cópia das entradas escondidas com o botão" Enviar A Ordem " num outro {[[0]}.

 11
Author: Jonathan Lonowski, 2008-12-18 23:01:58

Outra forma de contornar este problema, se estiver a usar alguma linguagem de programação do lado do servidor que lhe permite manipular os dados publicados, é declarar a sua forma html como esta:

<form>
<input name="a_name"/>
<input name="a_second_name"/>
<input name="subform[another_name]"/>
<input name="subform[another_second_name]"/>
</form>

Se você imprimir os dados postados( eu vou usar o PHP aqui), você vai obter um array como este:

//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',
      ),
    );
Então podes fazer algo como:
$my_sub_form_data = $_POST['subform'];
unset($_POST['subform']);

O seu $ _POST agora só tem os dados da sua "forma principal" , e os dados da sua sub-reforma são armazenados noutra variável que pode manipular em poder.

Espero que isto ajude!
 10
Author: Pierre, 2013-11-13 14:51:02
Note que não é permitido aninhar elementos de forma!

Http://www.w3.org/MarkUp/html3/forms.html

Https://www.w3.org/TR/html4/appendix/changes.html#h-A.3.9 (Especificação html4 notas não há alterações no que respeita aos formulários de nidificação de 3.2 a 4)

Https://www.w3.org/TR/html4/appendix/changes.html#h-A.1.1.12 (as especificações do html4 não indicam alterações no que respeita aos formulários de nidificação de 4.0 a 4.0 4.1)

Https://www.w3.org/TR/html5-diff/ (especificação html5 notas não há alterações no que respeita aos formulários de nidificação de 4 a 5)

Https://www.w3.org/TR/html5/forms.html#association-of-controls-and-forms comentários a " esta característica permite aos autores trabalhar em torno da falta de suporte para elementos de forma aninhada.", mas não cita onde for especificado, o que eu acho que eles estão partindo do princípio de que devemos assumir que é especificado no html3 especificação :)

 8
Author: Mark Peterson, 2017-09-13 14:36:41

Uma solução simples é usar uma iframe para manter a forma "aninhada". Visualmente o formulário é aninhado, mas no lado do código está em um arquivo html separado completamente.

 4
Author: Ezion, 2013-09-30 06:43:37

Mesmo que você pudesse fazê-lo funcionar em um navegador, não há garantia de que ele funcionaria o mesmo em todos os navegadores. Então, enquanto você pode ser capaz de fazê-lo funcionar alguns do tempo, você, certamente, não seria capaz de fazê-lo funcionar todos os do tempo.

 2
Author: Mike Hofer, 2008-12-18 23:38:53

Até teria problemas em fazê-lo funcionar em diferentes versões do mesmo navegador. Então, evite usar isso.

 2
Author: MP., 2012-02-24 18:21:11
Apesar de não apresentar uma solução para formas aninhadas( não funciona de forma fiável), apresento uma solução que funciona para mim:

Cenário de Utilização: uma superforme que permite alterar os itens N de uma só vez. Ele tem um botão "Submeter tudo" no fundo. Cada item quer ter sua própria forma aninhada com um botão" Submeter Item # N". Mas não posso...

Neste caso, pode-se realmente usar uma única forma, e então ter o nome dos botões be submit_1..submit_N e submitAll e lidar com servidores de TI-lado, por apenas olhando para os parâmetros que terminam em _1 se o nome do botão fosse 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>
Está bem, não é uma grande invenção, mas faz o trabalho.
 2
Author: Peter V. Mørch, 2016-01-22 09:41:39
Quanto aos formulários de nidificação, passei 10 anos numa tarde a tentar depurar um guião do ajax.

A minha resposta/exemplo anterior não tinha em conta a marcação html, desculpe.

<form id='form_1' et al>
  <input stuff>
  <submit onClick='ajaxFunction(That_Puts_form_2_In_The_ajaxContainer)' >
  <td id='ajaxContainer></td>
</form>

O Form_2 falhou constantemente ao dizer o form_2 inválido.

Quando movi o ajaxContainer que produziu o form_2 <i>outside</i> do form_1, estava de volta ao negócio. É a resposta à pergunta sobre por que um pode nidificar forma. Quero dizer, realmente, para que é o ID senão para definir qual o formulário a ser usado? Deve haver um melhor, o slicker trabalha por aí.
 1
Author: larry, 2012-10-09 22:07:59

Utilize a etiqueta do formulário vazia antes da sua forma aninhada

Testado e trabalhado no Firefox, cromado

Não testado em i. E.

<form name="mainForm" action="mainAction">
  <form></form>
  <form name="subForm"  action="subAction">
  </form>
</form>
 1
Author: Fatih, 2016-01-29 13:08:45

Embora a questão seja bastante antiga e eu concorde com o @ everyone que o ninho da forma não é permitido no HTML

Mas tudo isto pode querer ver isto.

Where you can hack (i'm called it A hack since I sure this ain't legitimate) html to allow browser to have nested form

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

 0
Author: Viren, 2014-05-26 15:32:59
Hoje, eu também fiquei preso no mesmo problema, e resolvi o problema eu adicionei um controle de usuário e
neste controlo uso este código
<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>
E no evento completo da Página, chame este método.
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);
    }
Acho que isto vai ajudar.
 0
Author: Shivanshu, 2015-03-03 06:26:58

Você também pode usar formaction = "" dentro da marca do botão.

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

Isto seria aninhado na forma original como um botão separado.

 0
Author: Chief Buddy, 2018-07-29 18:58:30
Antes de saber que não devia fazer isto, tinha formulários aninhados para ter vários botões de Submissão. Correu assim durante 18 meses, milhares de operações de inscrição, ninguém nos ligou sobre quaisquer dificuldades.

Formulários aninhados deram-me uma identificação para analisar para a acção correcta a tomar. Não Cedi até tentar ligar um campo a um dos botões e validar reclamou. Não foi nada de mais para desvendá-lo. usei uma linha explícita na forma exterior para que não importasse. o envio e o formulário não correspondem. Sim, sim, devia ter levado os botões de um submit para um onclick.

A questão é que há circunstâncias em que não está totalmente partido. Mas "não completamente quebrado" é talvez um padrão muito baixo para atirar para: -)
 0
Author: Roger Krueger, 2018-09-11 01:13:23
Não pode ter uma forma aninhada. Em vez disso, você pode abrir um Modal que contém forma e realizar Ajax formulário submeter.
 0
Author: Shree Sthapit, 2018-09-11 01:19:49