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

Je voudrais montrer un bouton radio, avoir sa valeur soumise, mais selon les circonstances, l'avoir non modifiable. Désactivé ne fonctionne pas, car il ne soumet pas la valeur (ou le fait-il?), et il grisonne le bouton radio. En lecture seule est vraiment ce que je cherche, mais pour une raison mystérieuse, cela ne fonctionne pas.

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

Incidemment, est-ce que quelqu'un savez-vous pourquoi la lecture seule ne fonctionne pas dans les boutons radio, alors qu'elle fonctionne dans d'autres balises d'entrée? Est-ce l'une de ces omissions incompréhensibles dans les spécifications HTML?

174
demandé sur SteveC 2009-12-23 17:09:12

13 réponses

J'ai truqué en lecture seule sur un bouton radio en désactivant uniquement les boutons radio non cochés. Il empêche l'utilisateur de sélectionner une valeur différente, et la valeur vérifiée sera toujours postée sur submit.

Utiliser jQuery pour faire readonly:

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

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

92
répondu Megan 2011-03-25 20:40:52

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/

188
répondu Sampson 2013-09-21 17:46:07

C'est l'astuce avec laquelle vous pouvez aller.

<input type="radio" name="name" onclick="this.checked = false;" />
18
répondu Sarfraz 2009-12-23 14:13:26

J'ai un long formulaire (250 + champs) qui poste dans une base de données. C'est une demande d'emploi en direct. Lorsqu'un administrateur regarde une application qui a été déposée, le formulaire est rempli avec des données de la base de données. Les textes d'entrée 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 en tant qu'éléments de formulaire. Désactiver les rend plus difficiles à lire. Réglage de l' .checked propriété à false onclick ne fonctionnera pas car ils peuvent avoir été vérifiés par le utilisateur remplissant l'application. De toute façon...

onclick="return false;"

Fonctionne comme un charme pour "désactiver" les radios et les cases à cocher ipso facto.

10
répondu humbolight 2012-10-16 18:27:23

La meilleure solution pour définir l'état vérifié ou décoché (à partir du client ou du serveur) et pour ne pas laisser l'utilisateur le changer après wards (c'est-à-dire le faire en lecture seule), procédez comme suit:

<input type="radio" name="name" onclick="javascript: return false;" />
7
répondu Vipresh 2014-05-21 13:33:10

J'ai trouvé un moyen javascript lourd pour atteindre un État en lecture seule pour les cases à cocher et les boutons radio. Il est testé contre les versions actuelles de Firefox, Opera, Safari, Google Chrome, ainsi que les versions actuelles et précédentes D'IE (JUSQU'à IE7).

Pourquoi ne pas simplement utiliser la propriété désactivée que vous demandez? Lors de l'impression de la page, les éléments d'entrée désactivés sortent dans une couleur grise. Le client pour lequel cela a été mis en œuvre voulait que tous les éléments sortent de la même couleur.

Je suis Je ne sais pas si je suis autorisé à poster le code source ici, car j'ai développé cela en travaillant pour une entreprise, mais je peux sûrement partager les concepts.

Avec les événements onmousedown, vous pouvez lire l'état de sélection avant que l'action de clic ne le modifie. Vous stockez donc ces informations, puis restaurez ces états avec un événement onclick.

<input id="r1" type="radio" name="group1" value="r1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="r2" type="radio" name="group1" value="r2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="r3" type="radio" name="group1" value="r3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 3</input>

<input id="c1" type="checkbox" name="group2" value="c1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="c2" type="checkbox" name="group2" value="c2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="c3" type="checkbox" name="group2" value="c3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 3</input>

La partie javascript de ceci fonctionnerait alors comme ceci (encore une fois seulement les concepts):

var selectionStore = new Object();  // keep the currently selected items' ids in a store

function storeSelectedRadiosForThisGroup(elementName) {
    // get all the elements for this group
    var radioOrSelectGroup = document.getElementsByName(elementName);

    // iterate over the group to find the selected values and store the selected ids in the selectionStore
    // ((radioOrSelectGroup[i].checked == true) tells you that)
    // remember checkbox groups can have multiple checked items, so you you might need an array for the ids
    ...
}

function setSelectedStateForEachElementOfThisGroup(elementName) {
    // iterate over the group and set the elements checked property to true/false, depending on whether their id is in the selectionStore
    ...

    // make sure you return false here
    return false;
}

Vous pouvez maintenant activer/désactiver la radio boutons / cases à cocher en modifiant les propriétés onclick et onmousedown des éléments d'entrée.

2
répondu Tom 2011-09-15 09:30:59

Façon JavaScript-cela a fonctionné pour moi.

<script>
$(document).ready(function() {
   $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); });
});
</script>

Raison:

  1. $('#YourTableId').find('*') -> cela renvoie toutes les balises.

  2. $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); }); itère sur tous les objets capturés dans ce et désactiver les balises d'entrée.

Analyse (Débogage):

  1. form:radiobutton est considéré en interne comme une balise "input".

  2. Comme dans la fonction ci-dessus(), si vous essayez d'imprimer document.write(this.tagName);

  3. Partout Où, dans les balises qu'il trouve des boutons radio, il retourne une balise input.

Ainsi, au-dessus de la ligne de code peut être plus optimisé pour les balises de bouton radio, en remplaçant * par entrée: $('#YourTableId').find('input').each(function () { $(this).attr("disabled", true); });

2
répondu user3702798 2014-06-03 11:32:15

Une option assez simple serait de créer une fonction javascript appelée sur l'événement "onsubmit" du formulaire pour activer le bouton radiobutton afin que sa valeur soit affichée avec le reste du formulaire.
Cela ne semble pas être une omission sur les spécifications HTML, mais un choix de conception (logique, à mon humble avis), Un radiobutton ne peut pas être en lecture seule comme un bouton ne peut pas l'être, si vous ne voulez pas l'utiliser, désactivez-le.

1
répondu wintermute 2009-12-23 14:26:38

J'ai trouvé que l'utilisation de onclick='this.checked = false;' travaillé dans une certaine mesure. Un bouton radio qui a été cliqué ne sera pas sélectionné. Cependant, s'il y avait un bouton radio qui était déjà sélectionné (par exemple, une valeur par défaut), ce bouton radio deviendrait désélectionné.

<!-- didn't completely work -->
<input type="radio" name="r1" id="r1" value="N" checked="checked" onclick='this.checked = false;'>N</input>
<input type="radio" name="r1" id="r1" value="Y" onclick='this.checked = false;'>Y</input>

Pour ce scénario, laisser la valeur par défaut seule et désactiver les autres boutons radio préserve le bouton radio déjà sélectionné et l'empêche d'être désélectionné.

<!-- preserves pre-selected value -->
<input type="radio" name="r1" id="r1" value="N" checked="checked">N</input>
<input type="radio" name="r1" id="r1" value="Y" disabled>Y</input>

Cette solution n'est pas la plus manière élégante d'empêcher la valeur par défaut d'être modifiée, mais cela fonctionnera si javascript est activé ou non.

1
répondu JW8 2011-11-02 23:16:39

Pour les boutons radio non sélectionnés, signalez-les comme désactivés. Cela les empêche de répondre à l'entrée de l'utilisateur et de désactiver le bouton radio vérifié. Par exemple:

<input type="radio" name="var" checked="yes" value="Yes"></input>
<input type="radio" name="var" disabled="yes" value="No"></input>
1
répondu dpolican 2013-05-15 23:26:35

Essayez l'attribut disabled, mais je pense que vous n'obtiendrez pas la valeur des boutons radio. Ou définir des images à la place comme:

<img src="itischecked.gif" alt="[x]" />radio button option

Cordialement.

1
répondu Tim 2014-05-21 13:34:21

Sur init:

pscript = "try{if($(this).attr('readonly')){return false;};}catch(err){};"

Me.Attributes.Add("onclick", pscript)

Gonza

-1
répondu gonzalo 2011-08-18 06:54:12

Qu'en est-il de capturer un événement" On_click () " dans JS et de le vérifier comme ici?:

Http://www.dynamicdrive.com/forums/showthread.php?t=33043

-2
répondu Ben Usman 2009-12-23 14:16:20