Comment assurer un champ de formulaire est soumis lorsqu'il est désactivé?
j'ai un select
champ de formulaire que je veux marquer comme "readonly", l'utilisateur ne peut pas modifier la valeur, mais la valeur est toujours soumis avec le formulaire. L'utilisation de l'attribut disabled
empêche l'utilisateur de changer la valeur, mais ne soumet pas la valeur avec le formulaire.
l'attribut readonly
n'est disponible que pour les champs input
et textarea
, mais c'est essentiellement ce que je veux. Est-il possible d'obtenir que le travail?
J'envisage deux possibilités:
- au lieu de désactiver le
select
, désactiver tous lesoption
et utiliser CSS pour griser le select de sorte qu'il ressemble à son désactivé. - Ajouter un gestionnaire d'événements à cliquer sur le bouton Soumettre pour activer tous les menus déroulants désactivés avant de soumettre le formulaire.
15 réponses
<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 pourriez avoir à mettre l'entrée hidden
soit avant, soit après le <select>
.
si ma mémoire me sert correctement, avec IIS, vous le mettez avant, avec Apache vous le mettez après. Comme toujours, les tests est la clé.
Désactiver les champs et les activer avant que le formulaire est soumis:
code jQuery:
jQuery(function ($) {
$('form').bind('submit', function () {
$(this).find(':input').prop('disabled', false);
});
});
j'ai cherché une solution pour cela, et puisque je n'ai pas trouvé de solution dans ce fil j'ai fait le mien.
// With jQuery
$('#selectbox').focus(function(e) {
$(this).blur();
});
Simple, il suffit de brouiller le champ lorsque vous vous concentrez sur lui, quelque chose comme le désactiver, mais vous envoyez réellement ses données.
il ne fonctionne pas avec le: sélecteur d'entrée pour les champs select, utilisez ceci:
jQuery(function() {
jQuery('form').bind('submit', function() {
jQuery(this).find(':disabled').removeAttr('disabled');
});
});
j'ai été confronté à un scénario légèrement différent, en ce que je voulais seulement ne pas permettre à l'utilisateur de changer la valeur sélectionnée sur la base d'une selectbox antérieure. Ce que j'ai fini par faire était de désactiver toutes les autres options non sélectionnées dans la selectbox en utilisant
$('#toSelect')find(':not(:selected)').attr('disabled','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 le jQuery one.
j'utilise le code suivant pour désactiver les options dans 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');
});
il suffit d'ajouter une ligne avant de soumettre.
$("#XYZ").removeAttr ("disabled");
la façon la plus facile que j'ai trouvée était de créer une fonction javascript minuscule liée à votre forme:
function enablePath() {
document.getElementById('select_name').disabled= "";
}
et vous l'appelez dans votre formulaire ici :
<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">
Ou vous pouvez appeler dans la fonction que vous utilisez pour vérifier votre formulaire :)
ou utilisez du JavaScript pour changer le nom du select et le mettre désactivé. De cette façon, le select est toujours soumis, mais en utilisant un nom que vous ne Vérifiez pas.
j'ai trouvé une solution pratique: supprimer tous les éléments sauf celui choisi. Vous pouvez ensuite modifier le style à quelque chose qui ressemble désactivée. En utilisant jQuery:
jQuery(function($) {
$('form').submit(function(){
$('select option:not(:selected)', this).remove();
});
});
j'ai créé un plugin rapide (jQuery seulement), qui sauve la valeur dans un champ de données pendant qu'une entrée est désactivée. Cela signifie Juste aussi longtemps que le champ est désactivé programmaticly par l'intermédiaire de jquery en utilisant .prop() ou .attr()... puis accéder à la valeur par .Val. ,)(serialize() ou .serializeArra () retournera toujours la valeur même si elle est désactivée:)
bouchon sans vergogne: https://github.com/Jezternz/jq-disabled-inputs
basé sur la solution du Jourdain, j'ai créé une fonction qui crée automatiquement une entrée cachée avec le même nom et la même valeur du select que vous voulez devenir invalide. Le premier paramètre peut être un id ou un élément jquery; Le second est un paramètre optionnel booléen où "true" désactive et "false" active l'entrée. Si omis, le deuxième paramètre bascule le sélectionner 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");
}
une autre option est d'utiliser l'attribut readonly.
<select readonly="readonly">
....
</select>
avec readonly la valeur est encore soumise, le champ d'entrée est grisé et l'utilisateur ne peut pas l'éditer.
Edit:
Cité de http://www.w3.org/TR/html401/interact/forms.html#adef-readonly :
- les éléments en lecture seule reçoivent la mise au point mais ne peuvent pas être modifiés par l'utilisateur. Les éléments en lecture seule
- sont inclus dans la navigation tabbing. Les éléments en lecture seule
- peuvent donner de bons résultats.
quand il dit que l'élément peut être réussi, il signifie qu'il peut être soumis, comme indiqué ici: http://www.w3.org/TR/html401/interact/forms.html#successful-controls