J'ai un champ de formulaire select
que je veux marquer comme "en lecture seule", car l'utilisateur ne peut pas modifier la valeur, mais la valeur est toujours soumise avec le formulaire. L'utilisation de l'attribut disabled
empêche l'utilisateur de modifier la valeur, mais ne la soumet pas avec le formulaire.
L'attribut readonly
n'est disponible que pour les champs input
et textarea
, mais c'est essentiellement ce que je veux. Y a-t-il un moyen de le faire fonctionner?
Deux possibilités que je considère incluent:
select
, désactivez tous les option
s et utilisez CSS pour masquer la sélection de sorte qu'elle ressemble à sa désactivée.<select disabled="disabled">
....
</select>
<input type="hidden" name="select_name" value="selected value" />
Où select_name
est le nom que vous donneriez normalement à <select>
.
Une autre option.
<select name="myselect" disabled="disabled">
<option value="myselectedvalue" selected="selected">My Value</option>
....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />
Maintenant, avec celui-ci, j’ai remarqué que, selon le serveur Web que vous utilisez, vous devrez peut-être entrer l’entrée hidden
avant ou après le <select>
.
Si ma mémoire est bonne, avec IIS, vous le mettez avant, avec Apache, vous le mettez après. Comme toujours, les tests sont la clé.
Désactivez les champs, puis activez-les avant que le formulaire ne soit soumis:
code jQuery:
jQuery(function ($) {
$('form').bind('submit', function () {
$(this).find(':input').prop('disabled', false);
});
});
Je cherchais une solution pour cela, et comme je ne trouvais pas de solution dans ce fil, je le faisais moi-même.
// With jQuery
$('#selectbox').focus(function(e) {
$(this).blur();
});
C'est simple, vous floutez le champ lorsque vous vous concentrez dessus, par exemple, vous le désactivez, mais vous envoyez ses données.
Je me trouvais face à un scénario légèrement différent, dans la mesure où je voulais uniquement empêcher l'utilisateur de modifier la valeur sélectionnée en fonction d'une zone de sélection antérieure. Ce que j’ai fini par faire, c’est tout simplement de désactiver toutes les autres options non sélectionnées de la zone de sélection en utilisant
$('#toSelect')find(':not(:selected)').attr('disabled','disabled');
cela ne fonctionne pas avec le sélecteur: input pour les champs sélectionnés, utilisez ceci:
jQuery(function() {
jQuery('form').bind('submit', function() {
jQuery(this).find(':disabled').removeAttr('disabled');
});
});
Même solution suggérée par Tres sans utiliser jQuery
<form onsubmit="document.getElementById('mysel').disabled = false;" action="..." method="GET">
<select id="mysel" disabled="disabled">....</select>
<input name="submit" id="submit" type="submit" value="SEND FORM">
</form>
Cela pourrait aider quelqu'un à comprendre plus, mais est évidemment moins flexible que celui de jQuery.
J'utilise le code suivant pour désactiver les options dans les sélections
<select class="sel big" id="form_code" name="code" readonly="readonly">
<option value="user_played_game" selected="true">1 Game</option>
<option value="coins" disabled="">2 Object</option>
<option value="event" disabled="">3 Object</option>
<option value="level" disabled="">4 Object</option>
<option value="game" disabled="">5 Object</option>
</select>
// Disable selection for options
$('select option:not(:selected)').each(function(){
$(this).attr('disabled', 'disabled');
});
Ajoutez simplement une ligne avant de soumettre.
$ ("# XYZ"). RemoveAttr ("disabled");
Le moyen le plus simple que j'ai trouvé était de créer une petite fonction javascript liée à votre formulaire:
function enablePath() {
document.getElementById('select_name').disabled= "";
}
et vous l'appelez sous votre forme ici:
<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">
Ou vous pouvez l'appeler dans la fonction que vous utilisez pour vérifier votre formulaire :)
J'ai créé un plugin rapide (Jquery uniquement), qui enregistre la valeur dans un champ de données lorsqu'une entrée est désactivée. Cela signifie simplement que tant que le champ est désactivé par programme via jquery à l'aide de .prop () ou .attr () ..., l'accès à la valeur par .val (), .serialize () ou .serializeArra () renvoie toujours le résultat. valeur même si désactivé :)
Prise éhontée: https://github.com/Jezternz/jq-disabled-inputs
Ou utilisez du JavaScript pour changer le nom de la sélection et le définir sur désactivé. De cette façon, la sélection est toujours soumise, mais sous un nom que vous ne vérifiez pas.
J'ai trouvé une solution viable: supprimez tous les éléments sauf celui sélectionné. Vous pouvez ensuite changer le style en quelque chose qui semble également désactivé. Utilisation de jQuery:
jQuery(function($) {
$('form').submit(function(){
$('select option:not(:selected)', this).remove();
});
});
Sur la base de la solution de Jordan, j'ai créé une fonction qui crée automatiquement une entrée masquée avec le même nom et la même valeur que la sélection que vous souhaitez invalider. Le premier paramètre peut être un élément id ou jquery; le second est un paramètre facultatif booléen où "true" est désactivé et "false" active l'entrée. Si omis, le second paramètre bascule la sélection entre "activé" et "désactivé".
function changeSelectUserManipulation(obj, disable){
var $obj = ( typeof obj === 'string' )? $('#'+obj) : obj;
disable = disable? !!disable : !$obj.is(':disabled');
if(disable){
$obj.prop('disabled', true)
.after("<input type='hidden' id='select_user_manipulation_hidden_"+$obj.attr('id')+"' name='"+$obj.attr('name')+"' value='"+$obj.val()+"'>");
}else{
$obj.prop('disabled', false)
.next("#select_user_manipulation_hidden_"+$obj.attr('id')).remove();
}
}
changeSelectUserManipulation("select_id");
<select id="example">
<option value="">please select</option>
<option value="0" >one</option>
<option value="1">two</option>
</select>
if (condition){
//you can't select
$("#example").find("option").css("display","none");
}else{
//you can select
$("#example").find("option").css("display","block");
}