J'ai une case à cocher qui, dans certaines conditions, doit être désactivée. Il s'avère que HTTP ne poste pas les entrées désactivées.
Comment puis-je contourner ça? soumettre l'entrée même si elle est désactivée et garder l'entrée désactivée?
UPDATE: READONLY
ne fonctionne pas avec les cases à cocher
Vous pouvez utiliser disabled="disabled"
mais à ce stade, la valeur de la case à cocher n'apparaîtra pas dans les valeurs POST
. Une des stratégies consiste à ajouter un champ caché contenant la valeur d'une case à cocher dans le même formulaire et à relire la valeur de ce champ.
Remplacez simplement disabled
par readonly
J'ai résolu ce problème.
Comme la balise readonly="readonly"
ne fonctionne pas (j'ai essayé différents navigateurs), vous devez utiliser disabled="disabled"
Mais la valeur de votre case à cocher ne sera pas publiée alors ...
Voici ma solution:
Pour obtenir "readonly" look et la valeur de la case à cocher POST en même temps, ajoutez simplement une "entrée" masquée avec le même nom et la même valeur que votre case à cocher. Vous devez le garder à côté de votre case à cocher ou entre les mêmes balises <form></form>
:
<input type="checkbox" checked="checked" disabled="disabled" name="Tests" value="4">SOME TEXT</input>
<input type="hidden" id="Tests" name="Tests" value="4" />
Aussi, juste pour que vous sachiez que readonly="readonly", readonly="true", readonly="",
ou que READONLY
ne résoudra PAS ceci! J'ai passé quelques heures à le comprendre!
Cette référence n’est PAS non plus pertinente (peut-être pas encore, ou plus, je n’en ai aucune idée): http://www.w3schools.com/tags/att_input_readonly.asp
Si vous êtes satisfait d’utiliser JQuery, supprimez l’attribut disabled lors de la soumission du formulaire:
$("form").submit(function() {
$("input").removeAttr("disabled");
});
Vous pourriez le gérer de cette façon ... Pour chaque case à cocher, créez un champ masqué avec le même attribut name
. Mais définissez la valeur de ce champ masqué avec une valeur par défaut que vous pourriez tester. Par exemple..
<input type="checkbox" name="myCheckbox" value="agree" />
<input type="hidden" name="myCheckbox" value="false" />
Si la case à cocher est "cochée" lors de la soumission du formulaire, la valeur de ce paramètre de formulaire sera
"agree,false"
Si la case à cocher n'est pas cochée, alors la valeur serait
"false"
Vous pouvez utiliser n'importe quelle valeur au lieu de "false", mais vous avez l'idée.
Le moyen le plus simple d'y parvenir est:
<input type="checkbox" class="special" onclick="event.preventDefault();" checked />
Cela empêchera l'utilisateur de pouvoir désélectionner cette case et il transmettra toujours sa valeur lors de l'envoi du formulaire. Supprimer coché si vous voulez que l'utilisateur ne puisse pas cocher cette case.
En outre, vous pouvez ensuite utiliser javascript pour supprimer onClick une fois qu'une certaine condition est remplie (si c'est ce que vous recherchez). Voici un violon sombre et sale montrant ce que je veux dire. Ce n'est pas parfait, mais vous obtenez le Gist.
<input type="checkbox" checked="checked" onclick="this.checked=true" />
J'ai commencé par le problème: "comment post/soumettre une case à cocher d'entrée qui est désactivée?" et dans ma réponse, j'ai ignoré le commentaire: "Si nous voulons désactiver une case à cocher, nous devons sûrement conserver une valeur préfixée (cochée ou décochée) et nous voulons aussi que l'utilisateur en soit conscient (sinon nous devrions utiliser un type caché et pas une case à cocher) ". Dans ma réponse, j'ai supposé que nous voulions toujours garder une case à cocher cochée et que le code fonctionne de cette manière. Si nous cliquons sur cette ckeckbox, elle sera vérifiée à jamais et sa valeur sera POSTED/Submitted! De même si j'écris onclick = "this.checked = false" sans coché = "coché" (note: la case par défaut est cochée), elle sera toujours décochée et sa valeur ne sera pas POSTED/Submitted !.
Ça fonctionne super bien:
Le seul inconvénient est le court clignotement des champs de saisie désactivés lors de la soumission. Au moins dans mon scénario, ce n’est pas un problème!
$('form').bind('submit', function () {
var $inputs = $(this).find(':input'),
disabledInputs = [],
$curInput;
// remove attributes
for (var i = 0; i < $inputs.length; i++) {
$curInput = $($inputs[i]);
if ($curInput.attr('disabled') !== undefined) {
$curInput.removeAttr('disabled');
disabledInputs.Push(true);
} else
disabledInputs.Push(false);
}
// add attributes
setTimeout(function() {
for (var i = 0; i < $inputs.length; i++) {
if (disabledInputs[i] === true)
$($inputs[i]).attr('disabled', true);
}
}, 1);
});
créer une classe css par exemple:
.disable{
pointer-events: none;
opacity: 0.5;
}
appliquer cette classe au lieu de l'attribut désactivé
Puisque:
Je vais vous offrir une autre possibilité:
Définissez votre case à cocher comme désactivée comme d'habitude. Et avant que le formulaire ne soit soumis par l'utilisateur, cochez cette case avec JavaScript.
<script>
function beforeSumbit() {
var checkbox = document.getElementById('disabledCheckbox');
checkbox.disabled = false;
}
</script>
...
<form action="myAction.do" method="post" onSubmit="javascript: beforeSubmit();">
<checkbox name="checkboxName" value="checkboxValue" disabled="disabled" id="disabledCheckbox" />
<input type="submit />
</form>
Comme la case à cocher est activée avant la soumission du formulaire, sa valeur est publiée de manière courante. La seule chose qui n’est pas très agréable avec cette solution, c’est que cette case à cocher est activée pendant un certain temps et que les utilisateurs peuvent la visualiser. Mais c'est juste un détail avec lequel je peux vivre.
Ne le désactivez pas; à la place, réglez-le sur readonly, bien que cela n’a aucun effet car il ne permet pas à l’utilisateur de changer d’état. Mais vous pouvez utiliser jQuery pour imposer cela (empêcher l’utilisateur de changer l’état de la case à cocher:
$('input[type="checkbox"][readonly="readonly"]').click(function(e){
e.preventDefault();
});
Cela suppose que toutes les cases à cocher que vous ne souhaitez pas modifier ont l'attribut "readonly". par exemple.
<input type="checkbox" readonly="readonly">
Ajoutez onsubmit="this['*nameofyourcheckbox*'].disabled=false"
au formulaire.
Malheureusement, il n'y a pas de solution «simple». L'attribut en lecture seule ne peut pas être appliqué aux cases à cocher. J'ai lu la spécification W3 à propos de la case à cocher et trouvé le coupable:
Si un contrôle n'a pas de valeur actuelle lors de la soumission du formulaire, les agents utilisateurs ne sont pas obligés de le traiter comme un contrôle réussi. ( http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 )
Cela fait que l'état non vérifié et l'état désactivé produisent la même valeur analysée.
La seule façon de le faire consiste à ajouter une entrée masquée portant le même nom avec javascript lors de la soumission du formulaire.
Vous pouvez utiliser le petit extrait que j'ai créé pour cela:
function disabled_checkbox() {
var theform = document.forms[0];
var theinputs = theform.getElementsByTagName('input');
var nrofinputs = theinputs.length;
for(var inputnr=0;inputnr<nrofinputs;inputnr++) {
if(theinputs[inputnr].disabled==true) {
var thevalueis = theinputs[inputnr].checked==true?"on":"";
var thehiddeninput = document.createElement("input");
thehiddeninput.setAttribute("type","hidden");
thehiddeninput.setAttribute("name",theinputs[inputnr].name);
thehiddeninput.setAttribute("value",thevalueis);
theinputs[inputnr].parentNode.appendChild(thehiddeninput);
}
}
}
Cela recherche le premier formulaire du document, rassemble toutes les entrées et recherche les entrées désactivées. Lorsqu'une entrée désactivée est trouvée, une entrée masquée est créée dans le parentNode avec le même nom et la valeur 'on' (si son état est 'coché') et '' si l'état est '' - pas coché.
Cette fonction doit être déclenchée par l'événement 'onsubmit' dans l'élément FORM en tant que:
<form id='ID' action='ACTION' onsubmit='disabled_checkbox();'>
Il n'y a pas d'autre option qu'un champ hidden
, essayez donc d'utiliser un champ hidden
comme le montre le code ci-dessous:
<input type="hidden" type="text" name="chk1[]" id="tasks" value="xyz" >
<input class="display_checkbox" type="checkbox" name="chk1[]" id="tasks" value="xyz" checked="check" disabled="disabled" >Tasks
<html>
<head>
<script type="text/javascript">
function some_name() {if (document.getElementById('first').checked) document.getElementById('second').checked=false; else document.getElementById('second').checked=true;}
</script>
</head>
<body onload="some_name();">
<form>
<input type="checkbox" id="first" value="first" onclick="some_name();"/>first<br/>
<input type="checkbox" id="second" value="second" onclick="some_name();" />second
</form>
</body>
</html>
La fonction nom_comme est un exemple de clause précédente permettant de gérer la deuxième case à cocher qui est cochée (affiche sa valeur) ou décochée (ne poste pas sa valeur) conformément à la clause et l'utilisateur ne peut pas modifier son statut; il n'est pas nécessaire de gérer la désactivation de la deuxième case à cocher
Vous pouvez le laisser désactivé comme vous le souhaitez, puis supprimer l'attribut désactivé avant la soumission du formulaire.
$('#myForm').submit(function() {
$('checkbox').removeAttr('disabled');
});
Ajout de onclick="this.checked=true"
Résoudre mon problème:
Exemple:
<input type="checkbox" id="scales" name="feature[]" value="scales" checked="checked" onclick="this.checked=true" />