259 votes

Pourquoi les boutons radio ne peuvent-ils pas être "en lecture seule" ?

Je voudrais afficher un bouton radio, que sa valeur soit soumise, mais que, selon les circonstances, elle ne soit pas modifiable. L'option "Disabled" ne fonctionne pas, car elle ne soumet pas la valeur (ou le fait-elle ?) et le bouton radio est grisé. La lecture seule est vraiment ce que je recherche, mais pour une raison mystérieuse, cela ne fonctionne pas.

Y a-t-il un truc bizarre que je dois faire pour que la lecture seule fonctionne comme prévu ? Devrais-je plutôt le faire en JavaScript ?

Par ailleurs, quelqu'un sait-il pourquoi la lecture seule ne fonctionne pas dans les boutons radio, alors qu'elle fonctionne dans les autres balises de saisie ? Est-ce une de ces omissions incompréhensibles dans les spécifications HTML ?

7 votes

"Est-ce une de ces omissions incompréhensibles dans les spécifications HTML ?" Pensez-y du point de vue de l'utilisateur. Pourquoi afficher un bouton sur lequel ils ne peuvent pas cliquer ?

89 votes

Pourquoi afficher un bouton sur lequel ils ne peuvent pas cliquer ? Parce que je veux qu'ils sachent que le bouton est là, mais je ne veux pas qu'ils puissent cliquer dessus tout de suite. Mais peut-être plus tard. Il s'agit d'un formulaire dynamique, après tout. Pourquoi un bouton radio serait-il différent de tout autre champ de saisie ?

8 votes

Voici les spécifications : w3.org/TR/html401/interact/forms.html#h-17.12.2 " Les éléments suivants prennent en charge l'attribut readonly : INPUT et TEXTAREA". Ce qui est évidemment faux. En revanche, ici même, nous voyons un résumé plus précis : w3.org/TR/WD-forms-970402#readonly "READONLY s'applique aux éléments INPUT de type TEXT ou PASSWORD et à l'élément TEXTAREA". On dirait que cela a glissé entre les interstices des recs et des specs.

243voto

Jonathan Sampson Points 121800

Les boutons radio ne doivent être en lecture seule que s'il existe d'autres options. Si vous n'avez pas d'autres options, un bouton radio coché ne peut pas être décoché. Si vous avez d'autres options, vous pouvez empêcher l'utilisateur de modifier la valeur simplement en désactivant les autres options :

<input type="radio" name="foo" value="Y" checked>
<input type="radio" name="foo" value="N" disabled>

Violon : http://jsfiddle.net/qqVGu/

3 votes

Le problème avec votre première solution est que si je veux activer le bouton radio par javascript, j'ai soudainement deux champs avec le même nom, donc je dois nettoyer l'un d'eux. Ou bien utiliser le champ caché pour de vrai et faire en sorte que le bouton radio définisse simplement la valeur du champ caché. D'une manière ou d'une autre, c'est juste un peu plus encombrant que ce que j'aimerais qu'un bouton radio soit. Votre deuxième solution, bien que je ne doute pas qu'elle fonctionne, sonne comme un hack vraiment laid. Je suppose donc que la solution javascript est la seule qui réponde à mes critères. C'est ce que je vais faire.

0 votes

La solution 2 est vraiment un mauvais hack qui ne fonctionnera probablement pas sur les navigateurs moins utilisés, tels que "links". Elle ne fonctionnera pas non plus sur tous les navigateurs car vous pouvez y accéder par TAB. Cela ne fera qu'embrouiller l'utilisateur.

7 votes

Solution 1 s'il vous plaît ! C'est la seule qui soit correctement accessible. Et si vous avez besoin de script, ce n'est qu'une ligne de plus pour définir l'activation du champ caché à l'opposé de l'activation de la radio.

180voto

Megan Points 734

J'ai simulé la lecture seule sur un bouton radio en désactivant uniquement les boutons radio non cochés. Cela empêche l'utilisateur de sélectionner une valeur différente, et la valeur cochée sera toujours affichée lors de l'envoi.

Utilisation de jQuery pour rendre la lecture obligatoire :

$(':radio:not(:checked)').attr('disabled', true);

Cette approche fonctionne également pour rendre une liste de sélection en lecture seule, sauf que vous devrez désactiver chaque option non sélectionnée.

2 votes

Merci @Megan, c'est une excellente solution.

9 votes

Une variante de cette méthode permet d'utiliser l'option readonly comme l'OP s'attendait à ce que cela fonctionne : $(':radio[readonly]:not(:checked)').attr('disabled', true);

1 votes

Parmi les solutions ci-dessous, celle-ci fournit le code le plus propre, et fonctionne bien avec le validateur Jquery puisque je n'ai pas besoin d'activer/désactiver les champs, ou de gérer le déliage des événements de clic et leur reliage lors de la soumission du formulaire.

26voto

Sarfraz Points 168484

C'est l'astuce que vous pouvez utiliser.

<input type="radio" name="name" onclick="this.checked = false;" />

4 votes

C'est exactement ce que je pensais, bien que ce serait mieux si vous précisiez que ce devrait être onClick="this.checked = <%=value%>" d'une certaine variété :)

0 votes

C'est bon à savoir. Les contrôles peuvent avoir des valeurs vraies ou fausses.

0 votes

Je vous préviens juste que cela ne fonctionnera pas pour ceux d'entre nous qui naviguent avec un javascript non activé par défaut.

18voto

humbolight Points 108

J'ai un long formulaire (plus de 250 champs) qui est envoyé à une base de données. Il s'agit d'une demande d'emploi en ligne. Lorsqu'un administrateur consulte une demande qui a été déposée, le formulaire est alimenté par les données de la base de données. Les textes de saisie et les zones de texte sont remplacés par le texte qu'ils ont soumis, mais les radios et les cases à cocher sont utiles à conserver comme éléments de formulaire. Leur désactivation les rend plus difficiles à lire. Le fait de définir la propriété .checked à false onclick ne fonctionnera pas car elles peuvent avoir été cochées par l'utilisateur qui remplit l'application. En tout cas...

onclick="return false;"

fonctionne à merveille pour "désactiver" les radios et les cases à cocher ipso facto.

12voto

Vipresh Points 359

La meilleure solution est de définir l'état coché ou non coché (soit à partir du client, soit à partir du serveur) et de ne pas laisser l'utilisateur le modifier par la suite (c'est-à-dire de le rendre en lecture seule) en procédant comme suit :

<input type="radio" name="name" onclick="javascript: return false;" />

0 votes

Non ! dans ce cas, l'utilisateur peut éditer le html dans le navigateur, marquer l'option nécessaire comme sélectionnée et poster le formulaire.

2 votes

Ils pourraient tout aussi bien supprimer l'attribut "readonly", s'il y en avait un. Ou simplement falsifier la requête entière avec leurs données. La validation côté serveur n'entre pas dans le cadre de cette question.

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