2009-02-17 30 views
257

¿Es válido html para tener lo siguiente:¿Es válido tener un formulario html dentro de otro formulario html?

<form action="a"> 
    <input.../> 
    <form action="b"> 
     <input.../> 
     <input.../> 
     <input.../> 
    </form> 
    <input.../> 
</form> 

así cuando presente "b" que sólo recibe los campos de la forma interior. Cuando envía "a" obtiene todos los campos menos aquellos dentro de "b".

Si no es posible, ¿qué soluciones para esta situación están disponibles?

+22

Me parece que esto es realmente una necesidad muy común que resulta familiar de las interfaces db: si un formulario actualiza la tabla A, y esa tabla tiene un campo vinculado a la tabla B, a menudo queremos una forma de actualizar o crear entradas para ese campo vinculado sin tener que abandonar el formulario actual. Los subformularios anidados serían una forma muy intuitiva de hacerlo (y es el ui implementado por varias bases de datos de escritorio). – monotasker

+1

No es válido. Hay soluciones temporales, pero debe usar otro método para obtener estos datos. Considere un formulario que envía todos los datos a un script de correo PHP, que luego envía parte (la parte de a) como un correo electrónico y parte (la parte de b) como otro correo electrónico. O en una base de datos, o lo que sea que esté haciendo con estos datos. Los formularios de anidación se pueden hacer, pero NO es la respuesta. – user1596138

+1

posible duplicado de [¿Puedes anidar formularios html?] (Http://stackoverflow.com/questions/379610/can-you-nest-html-forms) – user

Respuesta

301

A. No es HTML válido XHTML ni

En la especificación oficial del W3C XHTML, sección B, "Elemento Prohibiciones", establece que:

"form must not contain other form elements." 

http://www.w3.org/TR/xhtml1/#prohibitions

En cuanto a la mayor HTML 3.2 spec, la sección sobre el elemento FORMAS establece que:

"Cada formulario debe ser encerrado dentro de un elemento FORMULARIO. Puede haber varias formas en un solo documento, pero el elemento formulario no puede ser anidado "

B. La Solución

Sin embargo, alguien ha intentado ya que al:.

"Cómo crear una forma anidada."

http://blog.avirtualhome.com/how-to-create-nested-forms/

Nota:Aunque se puede engañar a los Validadores del W3C para pasar una página manipulando el DOM a través de secuencias de comandos, todavía no es HTML legal. El problema con el uso de estos enfoques es que el comportamiento de su código no está garantizado en todos los navegadores. (ya que no es estándar)

+62

pshh standards. La palabra me insulta –

+18

¿Para qué sirve el estándar pshh? –

+436

"Pshh" en este contexto, es aparentemente una onomatopeya utilizada para expresar disgusto con un cuerpo de normas particular. Transmite el mismo significado que "sí, correcto", "como si" o "lo que sea". A principios del siglo XXI, la palabra se convirtió en una oración por derecho propio: en realidad, una interjección, se usa como bloqueo conversacional pasivo-agresivo herramienta, dejando al respondedor sin una réplica convincente.Se rumorea que el W3C ha emitido un borrador de trabajo que describe los méritos de introducir el elemento en una versión futura de HTML. – GeneQ

7

No, la especificación HTML establece que ningún elemento FORM debe contener otro elemento FORM.

6

prefiere usar un javascript-método personalizado dentro del atributo de acción de la forma!

por ejemplo

<html> 
    <head> 
     <script language="javascript" type="text/javascript"> 
     var input1 = null; 
     var input2 = null; 
     function InitInputs() { 
      if (input1 == null) { 
       input1 = document.getElementById("input1"); 
      } 
      if (input2 == null) { 
       input2 = document.getElementById("input2"); 
      } 

      if (input1 == null) { 
       alert("input1 missing"); 
      } 
      if (input2 == null) { 
       alert("input2 missing"); 
      } 
     } 
     function myMethod1() { 
      InitInputs(); 
      alert(input1.value + " " + input2.value); 
     } 
     function myMethod2() { 
      InitInputs(); 
      alert(input1.value); 
     } 
     </script> 
    </head> 
    <body> 
     <form action="javascript:myMethod1();"> 
      <input id="input1" type="text" /> 
      <input id="input2" type="text" /> 
      <input type="button" onclick="myMethod2()" value="myMethod2"/> 
      <input type="submit" value="myMethod1" /> 
     </form> 
    </body> 
</html> 
+0

¡Justo lo que estaba buscando! –

5

Puede responder a su propia pregunta muy fácilmente introduciendo el código HTML en el W3 Validator. (Cuenta con un campo de entrada de texto, ni siquiera tendrá que poner su código en el servidor ...)

(Y no, no se validará.)

12

Como han dicho otros, no es HTML válido.

Parece que está haciendo esto para colocar los formularios visualmente uno dentro del otro. Si ese es el caso, solo haga dos formularios separados y use CSS para ubicarlos.

+2

+1 para hacer dos formularios separados y usar CSS para ubicarlos – billrichards

+0

Esto es lo que estaba pensando que necesitaría para mi sitio web, pero me encantaría un ejemplo de cómo hacer esto. –

20

HTML 4.x & HTML5 no permite formularios anidados, pero HTML5 permitirá una solución alternativa con el atributo "formulario" ("propietario del formulario").

En cuanto a 4.x HTML puede:

  1. uso de un formulario (s) con los campos ocultos solamente & JavaScript para establecer su entrada de y enviar el formulario.
  2. Usa CSS para alinear varios formularios HTML para que parezcan una sola entidad, pero creo que es muy difícil.
+1

No estoy seguro de por qué esto fue votado negativamente. Aquí el enlace a la sección W3C de los propietarios de formularios: http://www.w3.org/TR/html5/association-of-controls-and-forms.html#form-owner – SooDesuNe

+4

@SooDesuNe su enlace está desactualizado, aquí está el nuevo http://www.w3.org/TR/html5/forms.html#form-owner – chiliNUT

6

Una posibilidad es tener un iframe dentro de la forma externa. El iframe contiene la forma interna. Asegúrese de utilizar la etiqueta <base target="_parent" /> dentro de la etiqueta principal del iframe para que el formulario se comporte como parte de la página principal.

40

En caso de que alguien encuentre esta publicación aquí, es una gran solución sin la necesidad de JS. Utilice dos botones de envío con atributos de nombre diferentes para verificar en el idioma de su servidor, el botón de envío presionado porque solo uno de ellos será enviado al servidor.

<form method="post" action="ServerFileToExecute.php"> 
    <input type="submit" name="save" value="Click here to save" /> 
    <input type="submit" name="delete" value="Click here to delete" /> 
</form> 

El lado del servidor podría ser algo como esto si utiliza PHP:

<?php 
    if(isset($_POST['save'])) 
     echo "Stored!"; 
    else if(isset($_POST['delete'])) 
     echo "Deleted!"; 
    else 
     echo "Action is missing!"; 
?> 
+0

Esto no es lo mismo, en este caso usted quiere ir a la misma página y hacer diferentes acciones, con 2 formularios puede ir a diferentes páginas Y/O tener información diferente enviada en cada caso. –

+0

Puede usar un archivo php como contenedor e incluir cualquier archivo que desee si quiere el código en diferentes archivos. Entonces, en lugar de (echo "stored!";) Podría escribir (incluir "a.php";) – Andreas

+0

Tengo varios botones de eliminación en mi formulario (el motivo por el que venía considerando un formulario anidado) 1 para cada registro y una marque la casilla de verificación en cada uno para hacer una eliminación masiva. Su respuesta me ha impulsado a replantear mi plan. Ahora estoy pensando en que debo nombrar los botones para la eliminación individual con una identificación numérica y la eliminación masiva como tal. Il hacer php hacer la clasificación. – Chris

0

Si necesita que su formulario para enviar/commit datos a un 1: base de datos relacional M, recomendaría la creación de una "después de insertar" activador DB en la tabla A que insertará los datos necesarios para la tabla B.

1

No, no es válido. Pero una "solución" puede crear una ventana modal fuera de la forma "a" que contiene la forma "b".

<div id="myModalFormB" class="modal"> 
    <form action="b"> 
     <input.../> 
     <input.../> 
     <input.../> 
     <button type="submit">Save</button> 
    </form> 
</div> 

<form action="a"> 
    <input.../> 
    <a href="#myModalFormB">Open modal b </a> 
    <input.../> 
</form> 

Se puede hacer fácilmente si está utilizando el programa de arranque o materializar css. Estoy haciendo esto para evitar el uso de iframe.

Cuestiones relacionadas