jQuery val () et cases à cocher

Existe-t-il une justification pour que val() soit inutile pour les contrôles de case à cocher, alors qu’il est utile d’obtenir des données d’entrée de manière cohérente pour tous les autres contrôles d’entrée?

Par exemple, pour les cases à cocher, at semble toujours retourner “on” indépendamment de l’état de la case à cocher. Pour les autres contrôles d’entrée qui n’ont pas d’atsortingbut “value”, par exemple select et textarea, il se comporte comme prévu. Voir:

http://jsfiddle.net/jamietre/sdF2h/4/

Je ne peux pas penser à une bonne raison pour laquelle il ne reviendrait pas true ou false . À défaut, retournez au moins “on” uniquement lorsque cette case est cochée, et une chaîne vide si ce n’est pas le cas. A défaut, renvoyez au moins toujours une chaîne vide, car les cases à cocher n’ont aucun atsortingbut value !

De toute évidence, je sais comment obtenir la valeur en utilisant attr , mais voici la situation. Je développe une implémentation simple de C # jQuery (pour l’instant de toute façon) pour effectuer une parsing HTML sur le serveur, et j’essaie d’être totalement fidèle à l’implémentation de jQuery afin qu’elle se comporte de manière cohérente sur le client ou le serveur. Mais cela semble juste stupide et j’ai du mal à me faire coder “valeur” pour retourner “ON” pour une case à cocher, peu importe quoi. Mais si je ne le fais pas, ce ne sera pas cohérent. Alors j’essaie de comprendre, y a-t-il une raison pour cela? Est-ce que cela sert à quelque chose, ou est-ce simplement un artefact quelconque? Quelqu’un pourrait-il utiliser la méthode val() contre une case à cocher, si oui, pourquoi? Si non, pourquoi les architectes jQuery ont-ils choisi cette approche pour la rendre inutile?

Je ne peux pas penser à une bonne raison pour laquelle il ne reviendrait pas vrai ou faux. À défaut, retournez au moins “on” uniquement lorsque cette case est cochée, et une chaîne vide si ce n’est pas le cas. A défaut, renvoyez au moins toujours une chaîne vide, car les cases à cocher n’ont aucun atsortingbut value!

Les cases à cocher ont un atsortingbut de valeur. Il est assez courant de l’utiliser par exemple. multi-cases à cocher dans les formulaires, par exemple:

   

Ensuite, lorsque l’utilisateur soumet le formulaire, le serveur peut parsingr les cases à cocher qui ont été vérifiées en vérifiant les valeurs du tableau foo[] . La valeur de la case à cocher ne change pas si elle est cochée ou non; le navigateur n’envoie simplement pas les valeurs des cases non cochées au serveur. Si vous faites par exemple $('#your-form').serialize() dans jQuery, cela devrait fonctionner de la même façon; il ne doit pas inclure de valeurs de cases à cocher non cochées. Si vous omettez la valeur de la case à cocher, elle est simplement activée par défaut.

Si vous voulez vérifier si une case à cocher individuelle est cochée ou non dans jQuery, la meilleure façon la plus descriptive est de faire $(this).is(':checked')

Vous dites que “les cases à cocher n’ont aucun atsortingbut de value “. Au contraire: l’atsortingbut value est facultatif sauf sur les cases à cocher et les cases radio.

A partir des spécifications du W3C :

[l’atsortingbut value ] est facultatif sauf lorsque l’atsortingbut type a la valeur “radio” ou “checkbox”

on est la valeur par défaut que votre navigateur atsortingbue à l’élément lorsque vous ignorez la spécification et ne définissez pas d’atsortingbut de value .

Vous devez vous rappeler ce que la valeur signifie: il est envoyé avec le name de l’élément au serveur lorsque le formulaire est soumis. Si elle n’est pas cochée, la valeur n’est pas envoyée. La valeur activée n’est donc envoyée que lorsque la case est cochée.

Peut-être cela devrait aider

 $(document).ready(function() { $('input[type=checkbox]').click(function() { alert("val="+$(this).val()+",checked="+$(this).attr('checked')); }); }); 

Utilisez input[type=checkbox] à input[type=checkbox] pour sélectionner input type="checkbox" car la case à cocher est saisie avec type = “checkbox”

Et aussi mettre l’atsortingbut de valeur à la case à cocher.

Sur jsfiddle

METTRE À JOUR

 
PHP
JS
JAVA
PYTHON

Et php

 if($_POST){ foreach($_POST['ch'] as $post => $value){ echo "$post -> $value 
"; } }

Ils partagent tous le même nom car ils constituent un groupe de boutons commun. Vous savez ce qui a été vérifié et qui n’était pas à travers leurs valeurs.

L’autre façon est

 if($_POST){ foreach($_POST as $post => $value){ echo "$post -> $value 
"; } }
PHP
JS
JAVA
PYTHON

Mais le précédent semble append plus dynamic et moins fastidieux (je crois).

Et quant à la question de @ Capsule

 alert("val="+$(this).val()+",checked="+$(this).attr('checked'));  Check me. 

renvoie la valeur on je crois que c’est la valeur par défaut de la case à cocher.

Et la deuxième expérience donne également la valeur.

J’espère que je ne me trompe pas.

Si vous passez un tableau à la fonction val, la case à cocher sera cochée si la valeur de la case à cocher correspond à celle du tableau. Source: http://api.jquery.com/val/#val-value

  $("#checkbox").val(["remember"]); 

Une case à cocher n’est pas toujours seule et sa valeur est transmise lors de l’envoi du formulaire (sinon, le nom / la valeur n’est pas transmis du tout).

C’est très utile lors de la création de tableaux à partir de cases à cocher, vous pouvez utiliser name="test[]" comme nom et définir des valeurs différentes pour chacun. Lors de l’parsing du résultat soumis, vous vous retrouvez avec un tableau contenant toutes les valeurs vérifiées

La case à cocher a la même valeur que la zone de texte et cette valeur est envoyée au serveur lorsque le formulaire est envoyé uniquement si la case à cocher a été sélectionnée au moment de la soumission.

Contrairement à la zone de texte, la case à cocher a la valeur par défaut qui est activée – elle est envoyée au serveur lorsque la case à cocher est sélectionnée mais n’a pas de value propre, de sorte que le code de traitement peut savoir qu’il a été sélectionné.

Donc, la méthode .val() fonctionne .val() , renvoyant la valeur de l’élément.

Vous avez raison de dire que jQuery manque un moyen simple pour voir si une case à cocher / un bouton radio spécifique est sélectionné, quelque chose comme $("#mycheckbox").checked() . 🙂