Est-il possible d'imbriquer des formulaires HTML comme celui-ci
<form name="mainForm">
<form name="subForm">
</form>
</form>
afin que les deux formes fonctionnent? Mon ami a des problèmes avec ceci, une partie de subForm
fonctionne, alors qu'une autre partie ne fonctionne pas.
En un mot, non. Vous pouvez avoir plusieurs formulaires dans une page, mais ils ne doivent pas être imbriqués.
À partir du brouillon de travail html5 :
4.10.3 L'élément
form
Modèle de contenu:
Contenu du flux, mais sans descendants d'éléments de formulaire.
Le second formulaire sera ignoré, voir le extrait de WebKit par exemple:
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;
}
J'ai rencontré un problème similaire, et je sais que ce n'est pas une réponse à la question, mais cela peut aider quelqu'un avec ce genre de problème:
s'il est nécessaire de placer les éléments de deux ou plusieurs formulaires dans une séquence donnée, l'attribut HTML5<input> form
peut être la solution.
De http://www.w3schools.com/tags/att_input_form.asp :
- Le formulaire attribut est nouveau dans HTML5.
- Spécifie à quel élément
<form>
un élément<input>
appartient. La valeur de cet attribut doit être l'attribut id d'un élément<form>
dans le même document.
Scénario:
La mise en oeuvre:
<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" />
Ici vous trouverez la compatibilité du navigateur.
Plain html ne peut pas vous permettre de le faire. Mais avec javascript, vous pouvez faire cela . Si vous utilisez javascript/jquery, vous pouvez classer vos éléments de formulaire avec une classe, puis utiliser serialize () pour ne sérialiser que ces éléments de formulaire pour le sous-ensemble des éléments souhaités. soumettre.
<form id="formid">
<input type="text" class="class1" />
<input type="text" class="class2">
</form>
Ensuite, dans votre javascript, vous pouvez le faire pour sérialiser des éléments de classe 1
$(".class1").serialize();
Pour class2 tu pourrais faire
$(".class2").serialize();
Pour la forme entière
$("#formid").serialize();
ou simplement
$("#formid").submit();
Si vous utilisez AngularJS, toutes les balises <form>
de votre ng-app
sont remplacées à l'exécution par les directives ngForm
conçues pour être imbriquées.
Dans les formes angulaires peuvent être imbriquées. Cela signifie que le formulaire externe est valide lorsque tous les formulaires enfants le sont également. Cependant, les navigateurs n'autorisant pas l'imbrication d'éléments
<form>
, Angular fournit donc la directivengForm
qui se comporte de manière identique à<form>
mais qui peut être imbriquée. Cela vous permet d’avoir des formulaires imbriqués, ce qui est très utile lors de l’utilisation de directives de validation angulaires dans des formulaires générés dynamiquement à l’aide de la directivengRepeat
. ( la source )
Comme Craig l'a dit, non.
Mais, en ce qui concerne votre commentaire sur pourquoi :
Il serait peut-être plus facile d’utiliser 1 <form>
avec les entrées et le bouton "Mettre à jour" et d’utiliser les entrées masquées avec le bouton "Soumettre la commande" dans un autre <form>
.
Un autre moyen de contourner ce problème, si vous utilisez un langage de script côté serveur permettant de manipuler les données postées, consiste à déclarer votre formulaire HTML comme suit:
<form>
<input name="a_name"/>
<input name="a_second_name"/>
<input name="subform[another_name]"/>
<input name="subform[another_second_name]"/>
</form>
Si vous imprimez les données postées (j'utiliserai PHP ici), vous obtiendrez un tableau comme celui-ci:
//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',
),
);
Ensuite, vous pouvez simplement faire quelque chose comme:
$my_sub_form_data = $_POST['subform'];
unset($_POST['subform']);
Votre $ _POST ne contient plus que vos données de "formulaire principal" et vos données de sous-formulaire sont stockées dans une autre variable que vous pouvez manipuler à votre guise.
J'espère que cela t'aides!
Notez que vous n'êtes pas autorisé à imbriquer des éléments FORM!
http://www.w3.org/MarkUp/html3/forms.html
https://www.w3.org/TR/html4/appendix/changes.html#h-A.3.9 (la spécification html4 ne note aucune modification concernant les formulaires imbriqués de 3.2 à 4)
https://www.w3.org/TR/html4/appendix/changes.html#h-A.1.1.12 (la spécification html4 ne note aucun changement concernant les formulaires imbriqués de 4.0 à 4.1)
https://www.w3.org/TR/html5-diff/ (la spécification html5 n'indique aucune modification concernant les formulaires imbriqués de 4 à 5)
https://www.w3.org/TR/html5/forms.html#association-of-controls-and-forms comments to "Cette fonctionnalité permet aux auteurs de contourner le manque de prise en charge des éléments de formulaire imbriqués. ", mais ne cite pas où cela est spécifié, je pense qu'ils supposent que nous devrions supposer que cela est spécifié dans la spécification html3 :)
Une solution de contournement simple consiste à utiliser un iframe pour contenir le formulaire "imbriqué" . Visuellement, le formulaire est imbriqué, mais du côté du code, il se trouve dans un fichier HTML distinct.
Vous auriez même du mal à le faire fonctionner dans différentes versions du même navigateur. Alors évitez de l'utiliser.
Même si vous pouviez le faire fonctionner dans un seul navigateur, rien ne garantit qu'il fonctionnerait de la même manière dans tous les navigateurs. Ainsi, même si vous pouvez le faire fonctionner certains du temps, vous ne pourrez certainement pas le faire fonctionner tout du temps.
Vous pouvez également utiliser formaction = "" dans la balise button.
<button type="submit" formaction="/rmDog" method='post' id="rmDog">-</button>
Cela serait imbriqué dans le formulaire original en tant que bouton séparé.
Bien que je ne présente pas de solution aux formulaires imbriqués (cela ne fonctionne pas de manière fiable), je vous présente une solution de contournement qui fonctionne pour moi:
Scénario d'utilisation: Un superform permettant de changer N éléments à la fois. Il a un bouton "Soumettre tout" en bas. Chaque article veut avoir son propre formulaire imbriqué avec un bouton "Soumettre l'article n °". Mais ne peut pas ...
Dans ce cas, il est possible d'utiliser un seul formulaire, puis de nommer les boutons submit_1
..submit_N
et submitAll
et de le gérer côté serveur, en regardant uniquement les paramètres se terminant par _1
si le nom du bouton était 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>
Ok, donc pas vraiment une invention, mais ça fait le travail.
Utilisez une balise de formulaire vide avant votre formulaire imbriqué
Testé et travaillé sur Firefox, Chrome
Non testé sur I.E.
<form name="mainForm" action="mainAction">
<form></form>
<form name="subForm" action="subAction">
</form>
</form>
À propos des formes de nidification: un après-midi, j'ai passé 10 ans à essayer de déboguer un script ajax.
ma réponse précédente/exemple ne tenait pas compte du balisage HTML, désolé.
<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 échouait constamment en disant invalide form_2.
Lorsque j'ai déplacé le conteneur ajaxContainer qui a généré le formulaire_2 <i>outside</i>
du formulaire_1, j'étais de retour dans les affaires. C'est la réponse à la question de savoir pourquoi on pourrait imbriquer des formulaires. Je veux dire, vraiment, à quoi sert l'ID s'il ne faut pas définir quel formulaire doit être utilisé? Il doit y avoir un meilleur travail plus lisse.
Vraiment pas possible .... Je ne pouvais pas imbriquer des balises de formulaire .... Cependant, j'ai utilisé ce code:
<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>
avec {% csrf_token %}
et d'autres choses
et appliqué certains 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
}
}
});
Comme nous sommes en 2019, j'aimerais donner une réponse à jour à cette question. Il est possible d'obtenir le même résultat que les formes imbriquées, mais sans les imbriquer. HTML5 a introduit l'attribut de formulaire. Vous pouvez ajouter l'attribut de formulaire pour former des contrôles en dehors d'un formulaire afin de les lier à un élément de formulaire spécifique (par id).
https://www.impressivewebs.com/html5-form-attribute/
De cette façon, vous pouvez structurer votre code HTML comme ceci:
<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" form="sub-form" value="Save"/>
</div>
<input type="submit" name="main-save" value="Save" form="main-form" />
</div>
L'attribut de formulaire est pris en charge par tous les navigateurs modernes. IE ne prend pas cela en charge, mais IE n'est plus un navigateur, mais un outil de compatibilité, comme le confirme Microsoft lui-même: https://www.zdnet.com/article/Microsoft-security -chief-ie-n'est-pas-un-navigateur-so-stop-using-it-as-your-default- . Il est temps que nous cessions de nous préoccuper de faire fonctionner les choses dans IE.
https://caniuse.com/#feat=form-attribute
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fae-form
De la spécification HTML:
Cette fonctionnalité permet aux auteurs de contourner le manque de prise en charge de éléments de formulaire imbriqués.
Bien que la question soit assez ancienne et que je sois d’accord avec tous les pays, l’imbrication de formulaire n’est pas autorisée en HTML.
Mais ce quelque chose que tous pourraient vouloir voir ceci
où vous pouvez pirater (je l'appelle un piratage depuis que je suis sûr que ce n'est pas légitime) html pour permettre au navigateur d'avoir un formulaire imbriqué
<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