94 votes

HTML : Est-il possible d'avoir une balise FORM dans chaque ligne du tableau d'une manière valide pour le XHTML ?

Je peux le décrire comme suit :

Je veux ceci (la table entière dans editmode et bouton de sauvegarde dans chaque ligne).

<table>
    <tr>
        <td>Id</td>
        <td>Name</td>
        <td>Description</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td><input type="hidden" name="id" value="1" /></td>
        <td><input type="text" name="name" value="Name" /></td>
        <td><input type="text" name="description" value="Description" /></td>
        <td><input type="submit" value="Save" /></td>
    </tr>
    <tr>
        <td><input type="hidden" name="id" value="2" /></td>
        <td><input type="text" name="name" value="Name2" /></td>
        <td><input type="text" name="description" value="Description2" /></td>
        <td><input type="submit" value="Save" /></td>
    </tr>
    <!-- and more rows here ... -->
</table>

Où dois-je mettre le <form> tags ?

3 votes

Enveloppez votre tableau entier dans une balise de formulaire (et soumettez le tout) ou transformez votre tableau HTML en tableau. comme où chaque "rangée" est un formulaire. Voir ici : stackoverflow.com/a/15600151/1038812

1 votes

Voir la réponse d'Alexx Roche. Je pense que sa réponse devrait être la réponse acceptée. Sa réponse résout vraiment le problème.

1 votes

La réponse d'Alexx Roche n'était pas la meilleure dans mon cas, je suis en train d'afficher des informations sous forme de tableau.

134voto

tjbp Points 395

Il convient de noter que cela est possible en HTML5, grâce à l'attribut "form" des éléments de saisie :

<table>
    <tr>
        <td>Id</td>
        <td>Name</td>
        <td>Description</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td><form id="form1"><input type="hidden" name="id" value="1" /></form></td>
        <td><input form="form1" type="text" name="name" value="Name" /></td>
        <td><input form="form1" type="text" name="description" value="Description" /></td>
        <td><input form="form1" type="submit" value="Save" /></td>
    </tr>
    <tr>
        <td><form id="form2"><input type="hidden" name="id" value="1" /></form></td>
        <td><input form="form2" type="text" name="name" value="Name" /></td>
        <td><input form="form2" type="text" name="description" value="Description" /></td>
        <td><input form="form2" type="submit" value="Save" /></td>
    </tr>
</table>

Bien qu'il soit propre par son absence de JS et l'utilisation d'éléments originaux, il ne fonctionne malheureusement pas dans IE10.

1 votes

Malheureusement, ceci n'est pas supporté par IE ni Bord : caniuse.com/#feat=form-attribute

34 votes

Une réponse suffisante pour ceux d'entre nous qui se fichent de ie ou d'edge

1 votes

Je viens de remarquer qu'un formulaire d'administration très ancien (que nous utilisons quotidiennement) comportait des tableaux incorrectement imbriqués et qu'ils ont cessé de fonctionner dans les versions de développement de Chrome et de Firefox aujourd'hui. J'ai déplacé le </form> pour qu'il corresponde à la balise de début, puis j'ai ajouté l'attribut "form" à tous les champs de saisie et les formulaires en ligne ont immédiatement commencé à fonctionner correctement. J'ai vérifié et Edge/IEMobile sont les seuls navigateurs qui ne prennent pas en charge cette fonctionnalité. Microsoft a récemment annoncé qu'elle adoptait Chromium, ce qui pourrait ne plus être un problème majeur à l'avenir.

71voto

Alexx Roche Points 457

J'ai eu une question similaire et cette réponse en question HTML : table des formes ? l'a résolu pour moi. (Je ne suis pas sûr que ce soit du XHTML, mais cela fonctionne dans un navigateur HTML5).

Vous pouvez utiliser les css pour donner une présentation de tableau à d'autres éléments.

.table { display: table; } 
.table>* { display: table-row; }
.table>*>* { display: table-cell; }

Ensuite, vous utilisez le html valide suivant.

<div class="table"> 
    <form>
        <div>snake<input type="hidden" name="cartitem" value="55"></div>
        <div><input name="count" value="4" /></div>
    </form>
</div>

3 votes

Je vote pour cette solution très propre (et qui fonctionne) !

40voto

stereoscott Points 5647

Vous ne pouvez pas. Votre seule option est de le diviser en plusieurs tableaux et de placer la balise de formulaire en dehors de ceux-ci. Vous pourriez finir par imbriquer vos tableaux, mais ce n'est pas recommandé :

<table>
  <tr><td><form>
    <table><tr><td>id</td><td>name</td>...</tr></table>
  </form></td></tr>
</table>

Je supprimerais entièrement les tableaux et les remplacerais par des éléments html stylisés comme les divs et les spans.

3 votes

Je suis d'accord, n'utilisez pas de tableaux, utilisez des étiquettes et des éléments de formulaire et des CSS pour les aligner. Voir websiteoptimization.com/speed/tweak/forms

0 votes

J'avais peur que ce ne soit pas possible... grrr. Merci quand même

77 votes

S'il vous plaît, ne soyez pas "tablephobique" par défaut. Il existe de nombreux cas où les données doivent être affichées sous forme de tableau qui peut également nécessiter un formulaire. Je suis actuellement confronté à l'un de ces cas. Au final, vous finissez par imiter la syntaxe des tableaux avec des balises différentes...

4voto

Geoff Kendall Points 123

J'ai écrit ce texte il y a plus de dix ans, à une époque où le monde était différent. Aujourd'hui, je connais de nombreuses façons de résoudre ce problème particulier, mais une solution rapide et simple est la suivante qui validera consiste à faire à peu près la même chose, mais en utilisant des tableaux CSS pour la mise en page, pas un tableau HTML ordinaire.

Je dirais que vous pouvez le faire, bien que cela ne soit pas validé et que Firefox réorganise le code (ce que vous voyez dans "View generated source" lorsque vous utilisez Web Developer peut donc être surprenant). Je ne suis pas un expert, mais en mettant

<form action="someexecpage.php" method="post">

juste devant le

<tr>

et ensuite en utilisant

</tr></form>

à la fin de la ligne donne certainement la fonctionnalité (testé dans Firefox, Chrome et IE7-9). Cela a fonctionné pour moi, même si le nombre d'erreurs de validation produites a été un nouveau record personnel ! Aucun problème n'a été constaté en conséquence, et j'ai un tableau assez fortement stylisé. Je suppose que vous avez peut-être une table produite dynamiquement, comme moi, ce qui explique pourquoi l'analyse des lignes de la table n'est pas évidente pour nous, les mortels. Donc, en gros, ouvrez le formulaire au début de la ligne et fermez-le juste après la fin de la ligne.

1voto

Timothée Martin Points 570

Vous devez juste mettre le <form ... > avant la balise <table> et la balise </form> à la fin.

J'espère que cela vous aidera.

3 votes

Cela ne fonctionnera pas car il y a des éléments de formulaire avec le même nom pour chaque tablerow...

2 votes

En fait, cela fonctionnerait très bien - ajoutez le numéro de ligne à chaque élément, par exemple 'r1_name', puis sur la ligne suivante 'r2_name', il est assez facile d'analyser() ces éléments sur le serveur.

13 votes

Cela fonctionnera bien dans de nombreux cas, mais si votre tableau compte 1 000 lignes, vous n'avez probablement pas envie de soumettre l'ensemble du tableau alors que vous ne souhaitez mettre à jour qu'une seule ligne.

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