Est-ce un comportement standard pour les navigateurs d'envoyer uniquement les données de valeur d'entrée de case à cocher 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 dans tous les navigateurs?
<select>
avec deux optionson
etoff
:-)En HTML, chaque
<input />
élément est associé à une paire nom / valeur unique (mais pas unique). Cette paire est envoyée dans la requête suivante (dans ce cas, un corps de requête POST) uniquement si le<input />
est "réussi".Donc, si vous avez ces entrées dans votre
<form>
DOM:Générera ces paires nom + valeur qui seront soumises au serveur:
Remarquerez que:
two
etsix
ont été exclus parce qu'ils avaient l'disabled
ensemble d'attributs.three
a été envoyé deux fois car il contenait deux entrées valides portant le même nom.four
n'a pas été envoyé car c'est uncheckbox
qui n'a pas étéchecked
six
n'a pas été envoyé malgré le faitchecked
que l'disabled
attribut a une priorité plus élevée.seven
n'a pas d'name=""
attribut envoyé, il n'est donc pas soumis.En ce qui concerne votre question: vous pouvez voir qu'une case à cocher non cochée n'aura donc pas sa paire nom + valeur envoyée au serveur - mais d'autres entrées partageant le même nom seront envoyées avec lui.
Des cadres comme ASP.NET MVC contournent ce problème en associant (subrepticement) chaque
checkbox
entrée à unehidden
entrée dans le HTML rendu, comme ceci:Rendus:
Si l'utilisateur ne coche pas la case, les informations suivantes seront envoyées au serveur:
Si l'utilisateur coche la case, les deux seront envoyés:
Mais le serveur ignorera la
=false
version car il voit la=true
version, et donc s'il ne la voit pas,=true
il peut déterminer que la case à cocher a été rendue et que l'utilisateur ne l'a pas cochée - par opposition à ce que lesSomeBooleanProperty
entrées ne soient pas rendues du tout.la source
[]
à la fin du nom d'entrée, le comportement par défaut est de soumettre uniquement le dernier élément avec ce nom, donc tant que l'entrée masquée est avant la case à cocher, cela fonctionnera.[]
suffixe ne fait pas partie de la spécification HTML et les navigateurs ne le traitent pas spécialement. Sans le[]
PHP ne permettra l'accès qu'à une seule valeur (la dernière valeur) au lieu de toutes les valeurs.Si la case n'est pas cochée, cela ne contribue pas aux données envoyées lors de la soumission du formulaire.
La section HTML5 4.10.22.4 Construction de l'ensemble de données de formulaire décrit la façon dont les données de formulaire sont construites:
puis la valeur par défaut
on
est spécifiée si ellevalue
est manquante:Ainsi, les cases à cocher non cochées sont ignorées lors de la construction des données de formulaire.
Un comportement similaire est requis sous HTML4 . Il est raisonnable d'attendre ce comportement de la part de tous les navigateurs compatibles.
la source
Les cases à cocher affichent la valeur «on» si et seulement si la case est cochée. Insted of catching checkbox value, vous pouvez utiliser des entrées cachées
JS :
HTML :
la source
Oui, car sinon, il n'y aurait pas de moyen solide de déterminer si la case à cocher a réellement été cochée ou non (si elle modifiait la valeur, le cas peut exister lorsque la valeur souhaitée si elle était cochée serait la même que celle qu'elle était remplacé par).
D'autres réponses confirment que "on" est la valeur par défaut. Cependant, si la valeur ne vous intéresse pas, utilisez simplement:
la source
De la spécification HTML 4, qui devrait être cohérente dans presque tous les navigateurs:
http://www.w3.org/TR/html401/interact/forms.html#checkbox
La réussite est définie comme suit:
la source
input type = "hidden" name = "is_main" value = "0"
input type = "checkbox" name = "is_main" value = "1"
afin que vous puissiez contrôler comme ça comme je l'ai fait dans l'application. s'il vérifie alors envoyer la valeur 1 sinon 0
la source
Aucune des réponses ci-dessus ne m'a satisfait. J'ai trouvé que la meilleure solution est d'inclure une entrée masquée avant chaque entrée de case à cocher avec le même nom.
<input type="hidden" name="foo[]" value="off"/>
<input type="checkbox" name="foo[]"/>
Ensuite, du côté du serveur, en utilisant un petit algorithme, vous pouvez obtenir quelque chose de plus que HTML devrait fournir.
Ce sera l'entrée brute
Et la fonction retournera
la source
J'ai une page (formulaire) qui génère dynamiquement une case à cocher, donc ces réponses ont été d'une grande aide. Ma solution est très similaire à beaucoup ici mais je ne peux m'empêcher de penser qu'elle est plus facile à mettre en œuvre.
J'ai d'abord mis une zone de saisie cachée en ligne avec ma case à cocher, c'est-à-dire
Désormais, si tous les
checkboxes
sont désélectionnés, les valeurs renvoyées par le champ masqué seront toutes désactivées.Par exemple, ici avec cinq cases à cocher insérées dynamiquement, la forme
POSTS
des valeurs suivantes:Cela montre que seules les 3e et 4e cases à cocher sont
on
ouchecked
.En substance, le champ d'entrée factice ou masqué indique simplement que tout est désactivé à moins qu'il n'y ait un "on" sous l'index off, qui vous donne alors l'index dont vous avez besoin sans une seule ligne de code côté client.
.
la source
Tout comme la variante ASP.NET, sauf mettre l'entrée masquée avec le même nom avant la case à cocher réelle (du même nom). Seules les dernières valeurs seront envoyées. De cette façon, si une case est cochée, son nom et sa valeur "on" sont envoyés, alors que si elle n'est pas cochée, le nom de l'entrée masquée correspondante et la valeur que vous aimeriez lui donner seront envoyés. À la fin, vous obtiendrez le tableau $ _POST à lire, avec tous les éléments cochés et non cochés, les valeurs "on" et "false", pas de clés en double. Facile à traiter en PHP.
la source
Ayant le même problème avec les cases à cocher non cochées qui ne seront pas envoyées lors de l'envoi de formulaires, j'ai proposé une autre solution que de refléter les éléments de la case à cocher.
Obtenir toutes les cases à cocher non cochées avec
la source
J'ai résolu le problème avec ce code:
Formulaire HTML
et la fonction javascript en modifiant la forme de la valeur de la case à cocher:
et le serveur a vérifié si la publication de données est «activée» ou «désactivée». J'ai utilisé playframework java
la source