Come assicurarsi che un campo modulo <select> sia inviato quando è disabilitato?


180

Ho un selectcampo modulo che desidero contrassegnare come "di sola lettura", poiché l'utente non può modificare il valore, ma il valore viene comunque inviato con il modulo. L'uso disableddell'attributo impedisce all'utente di modificare il valore, ma non invia il valore con il modulo.

L' readonlyattributo è disponibile solo per inpute textareacampi, ma è fondamentalmente quello che voglio. C'è un modo per farlo funzionare?

Due possibilità che sto prendendo in considerazione includono:

  • Invece di disabilitare il select, disabilitare tutti optioni se usare CSS per rendere grigia la selezione in modo che sembri disabilitata.
  • Aggiungi un gestore eventi click al pulsante di invio in modo da abilitare tutti i menu a discesa disabilitati prima di inviare il modulo.

2
mi dispiace per aver aderito tardi, tuttavia le soluzioni fornite da @ trafalmadorianworkest sono le migliori. Disabilita tutti gli ingressi che non sono selezionati. Funzionerebbe anche se seleziona ha più opzioni abilitate. $('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani

In alternativa, è possibile lasciare il controllo disabilitato sull'interfaccia utente ma recuperare il valore nel metodo di azione: public ActionResult InsertRecord (modello MyType) {if (model.MyProperty == null) {model.MyProperty = Request ["MyProperty"]; }}
beastieboy

Risposte:


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

Dov'è select_nameil nome che normalmente daresti <select>.

Un'altra opzione.

<select name="myselect" disabled="disabled">
    <option value="myselectedvalue" selected="selected">My Value</option>
    ....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />

Ora, con questo, ho notato che, a seconda del server Web che stai utilizzando, potresti dover inserire l' hiddeninput prima o dopo il <select>.

Se la mia memoria mi serve correttamente, con IIS, la metti prima, con Apache la metti dopo. Come sempre, i test sono fondamentali.


3
In che modo ciò dipende dal server Web ? Non è il client che esegue il rendering della pagina con il campo select, e quindi in caso di conflitto del genere sarebbe il client a decidere se inviare il valore al server o no?
Ilari Kajaste,

8
Dipende da come il server gestisce più input con lo stesso nome.
Jordan S. Jones,

1
Faresti meglio a non fare affidamento su un tipo di server specifico, quindi penso che il primo approccio sia più pulito e meno soggetto a errori ..
Luca

5
@Jordan: i browser non inviano valori di campi disabilitati al server, motivo per cui sono vuoti quando si tenta di gestirli sul lato server. Se si dispone di un campo nascosto con il valore desiderato e i campi visibili sono disabilitati, solo il campo nascosto verrà inviato al server. Ergo, il campo nascosto dovrebbe essere creato (tramite JS o codice lato server) quando i campi visibili sono disabilitati e non vi sono problemi di priorità.
Matt van Andel,

1
Questa è un'opzione solo se hai bisogno di un modulo che funziona senza javascript.
Andrew,

224

Disabilitare i campi e quindi abilitarli prima dell'invio del modulo:

codice jQuery:

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});

15
Una bella soluzione!
Chris,

2
Questo è quello su cui ho deciso, principalmente perché è il meno invadente.
Jonathan,

3
I documenti jQuery consigliano di utilizzare .prop e .removeProp per 'controllato', 'selezionato' e 'disabilitato' invece di .attr e .removeAttr vedi http://api.jquery.com/prop/
Jim Bergman

2
Bit pertinente del commento di @ JimBergman: "Le proprietà influiscono generalmente sullo stato dinamico di un elemento DOM senza modificare l'attributo HTML serializzato. Gli esempi includono la proprietà value degli elementi input, la proprietà disabilitata di input e pulsanti o la proprietà selezionata di una casella di controllo. Il metodo .prop () dovrebbe essere usato per impostare disabilitato e controllato invece del metodo .attr (). Il metodo .val () dovrebbe essere usato per ottenere e impostare il valore. " - da api.jquery.com/prop
Joshua Dance

2
Sei un genio uno (Y)
TommyDo,

13

Ho cercato una soluzione per questo, e dal momento che non ho trovato una soluzione in questo thread ho fatto la mia.

// With jQuery
$('#selectbox').focus(function(e) {
    $(this).blur();
});

Semplice, offuschi il campo quando ti concentri su di esso, qualcosa come disabilitarlo, ma in realtà invii i suoi dati.


Wow Ottima e facile soluzione. Grazie .. +1 da parte mia :)
Naeem Ul Wahhab

Mi piace molto .. a seconda delle interazioni nella mia forma, gli elementi diventano abilitati / disabilitati avanti e indietro ... come riattivare un campo "sfocato" in questo scenario?
bkwdesign,

Da googling, sembra $ ('# selectbox'). Off ('focus'); farebbe il trucco di riattivare
bkwdesign l'

2
funziona per le caselle di testo, non funziona per le caselle selezionate, inoltre è molto facile spostarsi facendo clic e tenendo premuto il pulsante
Andrew

7

Ho dovuto affrontare uno scenario leggermente diverso, in quanto volevo solo non consentire all'utente di modificare il valore selezionato in base a una casella di selezione precedente. Quello che ho finito per fare è stato semplicemente disabilitare tutte le altre opzioni non selezionate nella casella selezionata utilizzando

$('#toSelect')find(':not(:selected)').attr('disabled','disabled');

Grazie, ho trovato il tuo il più logicamente più semplice. Comunque attrdovrebbe cambiare con prop, assomiglierebbe a qualcosa di simile$('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani

6

Stessa soluzione suggerita da Tres senza usare 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>

Questo potrebbe aiutare qualcuno a capire di più, ma ovviamente è meno flessibile di quello di jQuery.


Ma non è utile per più selettori. Possiamo essere che possiamo usare getElementsByTagName('select')?
Lucky

6

non funziona con il selettore di input per selezionare i campi, usare questo:

    jQuery(function() {

    jQuery('form').bind('submit', function() {
        jQuery(this).find(':disabled').removeAttr('disabled');
    });

    });

5

Uso il codice successivo per disabilitare le opzioni nelle selezioni

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

4

Il modo più semplice che ho trovato è stato quello di creare una minuscola funzione javascript legata al tuo modulo:

function enablePath() {
    document.getElementById('select_name').disabled= "";
}

e lo chiami nel tuo modulo qui:

<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">

Oppure puoi chiamarlo nella funzione che usi per controllare il tuo modulo :)


4

Basta aggiungere una riga prima di inviare.

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


2

Oppure usa JavaScript per modificare il nome della selezione e impostarlo su disabilitato. In questo modo la selezione viene comunque inviata, ma utilizzando un nome che non si sta verificando.


2

Ho installato un plug-in rapido (solo Jquery), che salva il valore in un campo dati mentre un input è disabilitato. Questo significa solo finché il campo viene disabilitato a livello di codice tramite jquery usando .prop () o .attr () ... quindi accedendo al valore con .val (), .serialize () o .serializeArra () restituirà sempre il valore anche se disabilitato :)

Spina senza vergogna: https://github.com/Jezternz/jq-disabled-inputs


2

Sulla base della soluzione della Giordania, ho creato una funzione che crea automaticamente un input nascosto con lo stesso nome e lo stesso valore della selezione che si desidera rendere non valido. Il primo parametro può essere un id o un elemento jquery; il secondo è un parametro facoltativo booleano in cui "true" disabilita e "false" abilita l'input. Se omesso, il secondo parametro commuta la selezione tra "abilitato" e "disabilitato".

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");

il parametro 'obj' deve essere un oggetto jquery
Doglas,

1

Ho trovato una soluzione praticabile: rimuovere tutti gli elementi tranne quello selezionato. È quindi possibile modificare lo stile in qualcosa che sembra disabilitato. Utilizzando jQuery:

jQuery(function($) {
    $('form').submit(function(){
        $('select option:not(:selected)', this).remove();
    });
});

0
<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");
}

-8

Un'altra opzione è utilizzare l'attributo readonly.

<select readonly="readonly">
    ....
</select>

Con readonly il valore è ancora inviato, il campo di input è disattivato e l'utente non può modificarlo.

Modificare:

Citato da http://www.w3.org/TR/html401/interact/forms.html#adef-readonly :

  • Gli elementi di sola lettura ricevono lo stato attivo ma non possono essere modificati dall'utente.
  • Gli elementi di sola lettura sono inclusi nella navigazione delle schede.
  • Gli elementi di sola lettura potrebbero avere esito positivo.

Quando dice che l'elemento può avere successo, significa che può essere inviato, come indicato qui: http://www.w3.org/TR/html401/interact/forms.html#successful-controls


6
Il controllo NON è disattivato e l'utente PUO 'modificarlo. Non hai letto l'intera sezione e cito: "I seguenti elementi supportano l'attributo readonly: INPUT e TEXTAREA."
Carlos Rendon,

3
So che questa è una vecchia risposta, ma in realtà funziona. Non conosco il motivo di molti voti negativi.
Ze Luis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.