Est-ce que c'est valide HTML d'avoir les éléments suivants:
<form action="a">
<input.../>
<form action="b">
<input.../>
<input.../>
<input.../>
</form>
<input.../>
</form>
Ainsi, lorsque vous soumettez "b", vous n'obtenez que les champs du formulaire interne. Lorsque vous soumettez "a", vous obtenez tous les champs moins ceux de "b".
Si ce n'est pas possible, quelles solutions de contournement pour cette situation sont disponibles?
A. Ce n'est pas valide HTML ni XHTML
Dans la spécification officielle W3C XHTML, la section B. "Éléments interdits" indique que:
"form must not contain other form elements."
http://www.w3.org/TR/xhtml1/#prohibitions
Comme pour l'ancien HTML 3.2 spec , la section relative à l'élément FORMS indique que:
"Chaque formulaire doit être inclus dans un élément FORM. Il peut y avoir plusieurs formulaires dans un seul document, mais l'élément FORM ne peut pas être imbriqué."
B. La solution de contournement
Il existe des solutions de contournement utilisant JavaScript sans qu'il soit nécessaire d'imbriquer des balises de formulaire.
"Comment créer un formulaire imbriqué." (malgré le titre, il s’agit de ) non balises de formulaire imbriquées, mais une solution de contournement JavaScript).
Réponses à cette question StackOverflow
Remarque: Bien que l'on puisse duper les validateurs du W3C pour passer une page en manipulant le DOM via un script, ce n'est toujours pas légal HTML . Le problème avec l'utilisation de telles approches est que le comportement de votre code n'est plus garanti entre les navigateurs. (puisque ce n'est pas standard)
Si quelqu'un trouve cet article, voici une excellente solution sans avoir besoin de JS. Utilisez deux boutons de soumission avec des attributs de nom différents dans la langue de votre serveur. Vérifiez que le bouton de soumission a été activé car un seul d'entre eux sera envoyé au serveur.
<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>
Le côté serveur pourrait ressembler à ceci si vous utilisez php:
<?php
if(isset($_POST['save']))
echo "Stored!";
else if(isset($_POST['delete']))
echo "Deleted!";
else
echo "Action is missing!";
?>
HTML 4.x et HTML5 n'autorisent pas les formulaires imbriqués, mais HTML5 autorisera une solution de contournement avec l'attribut "formulaire" ("propriétaire du formulaire").
En ce qui concerne HTML 4.x, vous pouvez:
Comme d'autres l'ont dit, ce n'est pas du HTML valide.
Il semble que vous fassiez cela pour positionner les formulaires visuellement les uns dans les autres. Si tel est le cas, il suffit de créer deux formulaires distincts et d'utiliser CSS pour les positionner.
Non, la spécification HTML stipule qu'aucun élément FORM
ne doit contenir un autre élément FORM
.
utilisez plutôt une méthode javascript personnalisée dans l'attribut action du formulaire!
par exemple
<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>
Une possibilité est d'avoir un iframe dans la forme externe. L'iframe contient la forme interne. Veillez à utiliser la balise <base target="_parent" />
à l'intérieur de la balise head de l'iframe pour que le formulaire se comporte comme une partie de la page principale.
Vous pouvez répondre à votre propre question très facilement en entrant le code HTML dans le W3 Validator . (Il comporte un champ de saisie de texte, vous n'aurez même pas à mettre votre code sur un serveur ...)
(Et non, ça ne va pas valider.)
non, voir w3c
Non, ce n'est pas valide. Mais une "solution" peut être la création d’une fenêtre modale en dehors de la forme "a" contenant la forme "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>
Cela peut être facilement fait si vous utilisez bootstrap ou matérialisez css. Je fais cela pour éviter d'utiliser iframe.
Si vous avez besoin que votre formulaire envoie/valide des données dans une base de données relationnelle 1: M, je vous recommande de créer un déclencheur de base de données "après insertion" sur la table A, qui insérera les données nécessaires pour la table B.