562 votes

Pouvez-vous imbriquer des formulaires html ?

Est-il possible d'imbriquer des formulaires html comme ceci

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

pour que les deux formes fonctionnent ? Mon ami a des problèmes avec cela. subForm fonctionne, tandis qu'une autre partie ne fonctionne pas.

1 votes

Il met en place un panier, où la quantité à mettre à jour se trouve à l'intérieur du formulaire qui garde la trace des totaux. Personnellement, je ne ferais pas cela, mais il rencontre des problèmes pour que cela fonctionne.

1 votes

Il semble qu'il ferait mieux d'utiliser Javascript pour copier les valeurs d'un formulaire à l'autre, plutôt que d'essayer de les imbriquer. Je ne pense pas que l'imbrication fonctionnera.

0 votes

Vous auriez même des difficultés à le faire fonctionner dans différentes versions d'un même navigateur. Évitez donc de l'utiliser.

548voto

Craig Points 15049

En un mot, non. Vous pouvez avoir plusieurs formulaires dans une page, mais ils ne doivent pas être imbriqués.

De la projet de travail html5 :

4.10.3 Le form élément

Modèle de contenu :

Contenu du flux, mais sans descendants de l'élément de forme.

2 votes

Il est probable qu'il s'agisse d'une application .net (qui comporte une balise <form> autour de tout). Chaque fois que vous essayez d'imbriquer des formulaires, il y a un défaut de conception quelque part. En général, vous voulez deux formulaires l'un à côté de l'autre, enveloppés dans un seul DIV pour des raisons de style uniquement.

166 votes

Je suis d'accord avec la réponse, mais pour en demander une autre, pourquoi pas ? Pourquoi le HTML ne permet-il pas l'imbrication des formes ? Pour moi, il s'agit d'une limitation dont nous serions mieux sans. Il existe de nombreux exemples où l'utilisation de formulaires imbriqués serait plus facile à programmer (par exemple, l'utilisation d'un formulaire de téléchargement de photo avec un formulaire de modification de profil).

38 votes

@Nilzor il ne demande pas si cela peut être fait ou non, il demande POURQUOI pas. Je suis d'accord ; l'imbrication des formulaires est en fait très utile. Ainsi, si vous avez une application d'une page avec des onglets, chaque onglet est son propre formulaire (de sorte que vous pouvez le soumettre pour enregistrer la progression), et ils sont tous enveloppés dans un formulaire, que vous pouvez soumettre pour tout enregistrer. Cela me semble logique.

93voto

Vitalii Fedorenko Points 17469

La deuxième forme sera ignorée, voir la page d'accueil. 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;
}

45voto

user2420019 Points 81

Le html simple ne peut pas vous permettre de faire cela. Mais avec javascript vous pouvez le faire. 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 d'éléments que vous voulez soumettre.

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

Ensuite, dans votre javascript, vous pourriez faire ceci pour sérialiser les éléments class1

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

Pour la classe 2, vous pourriez faire

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

Pour l'ensemble du formulaire

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

ou simplement

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

14voto

Piero Points 1231

Une autre façon de contourner ce problème, si vous utilisez un langage de script côté serveur qui vous permet de manipuler les données affiché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 affichées (je vais utiliser 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 les données du "formulaire principal", et les données du sous-formulaire sont stockées dans une autre variable que vous pouvez manipuler à volonté.

J'espère que cela vous aidera !

13voto

Jonathan Lonowski Points 45253

Comme Craig l'a dit, non.

Mais, concernant votre commentaire sur pourquoi :

Il serait peut-être plus facile d'utiliser 1 <form> avec les entrées et le bouton "Mettre à jour", et utiliser la copie des entrées cachées avec le bouton "Soumettre la commande" dans une autre <form> .

0 votes

J'ai fait ma page de panier comme ça, il a juste pris un chemin différent et n'a pas voulu le changer. Je ne savais pas non plus si sa méthode était vraiment valable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X