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 les option 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.
154
demandé sur Steve Chambers 2009-07-28 03:01:59

15 réponses

<select disabled="disabled">
    ....
</select>
<input type="hidden" name="select_name" value="selected value" />

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é.

102
répondu Jordan S. Jones 2009-07-27 23:04:31

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);
  });
});
202
répondu Tres 2015-09-08 00:40:06

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.

11
répondu Jean Paul Rumeau 2012-09-14 01:18:46

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');
    });

    });
6
répondu chhalpha 2013-01-25 07:47:51

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');
6
répondu trafalmadorian 2013-05-02 02:18:01

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.

5
répondu Marco Demaio 2017-05-23 12:34:30

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');
});
5
répondu Aleks 2012-12-11 11:51:36

il suffit d'ajouter une ligne avant de soumettre.

$("#XYZ").removeAttr ("disabled");

4
répondu PPB 2013-03-23 12:44:31

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 :)

3
répondu Alex PARISOT 2012-02-23 13:14:02

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.

2
répondu Byron Whitlock 2009-07-27 23:04:54

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();
    });
});
1
répondu Alftheo 2010-12-24 06:56:03

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

1
répondu Josh Mc 2013-06-08 02:27:01

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");
1
répondu Doglas 2016-01-21 22:39:31
<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");
}
0
répondu Thxopen 2016-12-27 08:15:06

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

-6
répondu Phillip Whelan 2010-03-01 17:29:40