198 votes

Les cases à cocher n'affichent-elles des données que si elles sont cochées ?

Le comportement standard des navigateurs consiste-t-il à n'envoyer les données de la valeur de la case à cocher que si elle est cochée lors de la soumission du formulaire ?

Et si aucune donnée de valeur n'est fournie, la valeur par défaut est-elle toujours "on" ?

En supposant que ce qui précède est correct, ce comportement est-il cohérent sur tous les navigateurs ?

207voto

John C Points 3389

Oui, le comportement standard est que la valeur n'est envoyée que si la case est cochée. Cela signifie généralement que vous devez avoir un moyen de vous souvenir des cases à cocher que vous attendez du côté serveur, car toutes les données ne reviennent pas du formulaire.

La valeur par défaut est toujours "on", ce qui doit être cohérent avec les navigateurs.

Ce sujet est traité dans le Recommandation du W3C pour le HTML 4 :

Les cases à cocher (et les boutons radio) sont des interrupteurs marche/arrêt qui peuvent être basculés par l'utilisateur. Un interrupteur est "activé" lorsque l'attribut checked de l'élément de contrôle est activé. Lorsqu'un formulaire est soumis, seuls les contrôles de case à cocher "activés" peuvent réussir. peuvent être validés.

21 votes

Malheureusement c'est une vérité douloureuse, seules les cases à cocher cochées sont envoyées au serveur, pas celles qui ne sont pas cochées. Si vous savez à l'avance quelles sont les cases à cocher sur la page, ce n'est pas un problème pour le script côté serveur de les gérer. Le problème est lorsque vous ne savez pas cela à l'avance - des cases à cocher créées dynamiquement sur la page en fonction d'une certaine logique commerciale. Il faut alors trouver des astuces et utiliser des champs de saisie cachés en parallèle pour ces cases à cocher et les remplir avec JavaScript.

0 votes

La clé pour créer un validateur cohérent avec les contrôles "autorisés sans succès" (c'est-à-dire type="checkbox") est de désigner ces contrôles de formulaire comme étant transitoire . En cas d'échec, modifiez dynamiquement votre assainisseur et votre validateur en conséquence.

5 votes

Solution : utiliser <select> avec deux options on y off :-)

100voto

Dai Points 24530

En HTML, chaque <input /> est associé à un seul (mais pas unique) couple nom/valeur. Cette paire est envoyée dans la requête suivante (dans ce cas, un corps de requête POST) uniquement si l'élément <input /> est "réussi".

Donc si vous avez ces entrées dans votre <form> DOM :

<input type="text"     name="one"   value="foo"                        />
<input type="text"     name="two"   value="bar"    disabled="disabled" />
<input type="text"     name="three" value="first"                      />
<input type="text"     name="three" value="second"                     />

<input type="checkbox" name="four"  value="baz"                        />
<input type="checkbox" name="five"  value="baz"    checked="checked"   />
<input type="checkbox" name="six"   value="qux"    checked="checked" disabled="disabled" />
<input type="checkbox" name=""      value="seven"  checked="checked"   />

<input type="radio"    name="eight" value="corge"                      />
<input type="radio"    name="eight" value="grault" checked="checked"   />
<input type="radio"    name="eight" value="garply"                     />

Générera ces paires nom+valeur qui seront soumises au serveur :

one=foo
three=first
three=second
five=baz
eight=grault

Remarquez ça :

  • two y six ont été exclus parce qu'ils avaient le disabled l'ensemble des attributs.
  • three a été envoyé deux fois parce qu'il avait deux entrées valides avec le même nom.
  • four n'a pas été envoyé car il s'agit d'un checkbox qui n'était pas checked
  • six n'a pas été envoyé bien qu'il ait été checked parce que le disabled a une priorité plus élevée.
  • seven n'a pas de name="" envoyé, il n'est donc pas soumis.

En ce qui concerne votre question : vous pouvez voir qu'une case à cocher qui n'est pas cochée n'aura donc pas sa paire nom+valeur envoyée au serveur - mais d'autres entrées qui partagent le même nom seront envoyées avec elle.

Les frameworks comme ASP.NET MVC contournent ce problème en associant (subrepticement) chaque checkbox avec une hidden dans le HTML rendu, comme suit :

@Html.CheckBoxFor( m => m.SomeBooleanProperty )

Rendu :

<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden"   name="SomeBooleanProperty" value="false" />

Si l'utilisateur ne coche pas la case, le message suivant sera envoyé au serveur :

SomeBooleanProperty=false

Si l'utilisateur coche la case, les deux seront envoyés :

SomeBooleanProperty=true
SomeBooleanProperty=false

Mais le serveur ignorera le =false parce qu'il voit la =true et donc s'il ne voit pas =true il peut déterminer que la case à cocher a été rendue et que l'utilisateur ne l'a pas cochée - contrairement à l'option SomeBooleanProperty les entrées ne sont pas rendues du tout.

0 votes

Il convient de noter que si vous avez plusieurs champs, comme avec la zone de texte cachée supplémentaire, le backend recevra un tableau de valeurs.

0 votes

Il ne reçoit un tableau que si vous utilisez [] à la fin du nom de l'entrée, le comportement par défaut est de ne soumettre que le dernier élément portant ce nom, donc tant que l'entrée cachée se trouve avant la case à cocher, cela fonctionnera.

0 votes

En ayant deux champs avec le même nom (champ caché + champ case à cocher), et en cochant la case à cocher, la valeur du message est une chaîne de valeurs séparées par des virgules, c'est-à-dire quelque chose comme "0,1".

16voto

Adam Zalcman Points 13198

Si la case n'est pas cochée, elle ne contribue pas aux données envoyées lors de la soumission du formulaire.

Section HTML5 4.10.22.4 Construire l'ensemble des données du formulaire décrit la manière dont les données du formulaire sont construites :

Si l'une des conditions suivantes est remplie, passez ces sous-étapes pour cet élément : [...]

L'élément field est un élément d'entrée dont le type est dans l'état Checkbox et dont le contrôle est faux.

et ensuite la valeur par défaut on est spécifié si value est manquant :

Sinon, si l'élément de champ est un élément d'entrée dont l'attribut de type est dans l'état Case à cocher ou Bouton radio, exécutez ces sous-étapes imbriquées supplémentaires :

Si l'élément de champ a un attribut de valeur spécifié, alors la valeur est la valeur de cet attribut ; sinon, la valeur est la chaîne "on".

Ainsi, les cases à cocher non cochées sont ignorées lors de la construction des données du formulaire.

Un comportement similaire est requis en vertu de HTML4 . Il est raisonnable d'attendre ce comportement de la part de tous les navigateurs conformes.

8voto

Jay Points 1867

Le comportement standard des navigateurs consiste-t-il à n'envoyer les données de la valeur de la case à cocher que si elle est cochée lors de la soumission du formulaire ? que si elle est cochée lors de la soumission du formulaire ?

Oui, parce que sinon il n'y aurait pas de moyen solide de déterminer si la case à cocher a été effectivement cochée ou non (si elle a changé la valeur, il se peut que la valeur souhaitée si elle était cochée soit la même que celle sur laquelle elle a été permutée).

Et si aucune donnée de valeur n'est fournie, la valeur par défaut est-elle toujours "on" ?

D'autres réponses confirment que "on" est la valeur par défaut. Cependant, si vous n'êtes pas intéressé par la valeur, utilisez simplement :

if (isset($_POST['the_checkbox'])){
    // name="the_checkbox" is checked
}

7voto

Alex W Points 11502

De la spécification HTML 4, qui devrait être cohérente sur presque tous les navigateurs :

http://www.w3.org/TR/html401/interact/forms.html#checkbox

Les cases à cocher (et les boutons radio) sont des interrupteurs marche/arrêt qui peuvent être basculés par l'utilisateur. Un interrupteur est "activé" lorsque l'attribut checked de l'élément de contrôle est activé. Lorsqu'un formulaire est soumis, seuls les contrôles de case à cocher "activés" peuvent devenir des succès. peuvent être validés.

Le succès est défini comme suit :

Un contrôle réussi est "valable" pour la soumission. Chaque contrôle réussi son nom est associé à sa valeur actuelle dans l'ensemble de données du formulaire l'ensemble des données du formulaire soumis. Un contrôle réussi doit être défini dans un élément FORM et doit avoir un nom de contrôle.

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