Come faccio ad aggiungere opzioni a un DropDownList usando jQuery?


291

Come dice la domanda, come posso aggiungere una nuova opzione a un DropDownList usando jQuery?

Grazie


Solo curioso, perché questa domanda è stata sottovalutata? Probabilmente perché non mostra alcun frammento di codice :)
shasi kanth,

Risposte:


451

Senza utilizzare plugin aggiuntivi,

var myOptions = {
    val1 : 'text1',
    val2 : 'text2'
};
var mySelect = $('#mySelect');
$.each(myOptions, function(val, text) {
    mySelect.append(
        $('<option></option>').val(val).html(text)
    );
});

Se avevi molte opzioni, o questo codice doveva essere eseguito molto frequentemente, allora dovresti esaminare un DocumentFragment invece di modificare il DOM molte volte inutilmente. Solo per una manciata di opzioni, direi che non ne vale la pena però.

------------------------------- Aggiunto ------------------ --------------

DocumentFragmentè una buona opzione per il miglioramento della velocità, ma non possiamo creare un elemento opzione usando document.createElement('option')IE6 e IE7 non lo supportano.

Quello che possiamo fare è creare un nuovo elemento select e quindi aggiungere tutte le opzioni. Al termine del ciclo, aggiungerlo all'oggetto DOM effettivo.

var myOptions = {
    val1 : 'text1',
    val2 : 'text2'
};
var _select = $('<select>');
$.each(myOptions, function(val, text) {
    _select.append(
            $('<option></option>').val(val).html(text)
        );
});
$('#mySelect').append(_select.html());

In questo modo modificheremo DOM per una sola volta!


8
I parametri del metodo sono un po 'fuorvianti, ad esempio la funzione (val, testo) dovrebbe essere la funzione (indice, opzione). Funziona bene altrimenti.
mbillard,

14
@Crossbrowser: non sono d'accordo - vale in textrealtà descrivo le variabili e il loro uso.
Nickf

1
solo per quell'esempio, tuttavia come metodo di uso generale, quelle variabili sono fuorvianti (non mi ha dato indizi su come usare quel metodo). Tuttavia, darò che la risposta non riguardava l'uso del metodo $ .each.
mbillard,

1
In precedenza utilizzavo mySelect.append(new Option(text, val));, che non funzionava in IE8. Ho dovuto passare a @ nickf'smySelect.append($('<option></option>').val(val).html(text));
Matthew Clark il

5
@briansol:.attr('selected', true|false)
nickf,

167

Senza plug-in, questo può essere più semplice senza usare troppi jQuery, invece andare leggermente più vecchio stile:

var myOptions = {
    val1 : 'text1',
    val2 : 'text2'
};
$.each(myOptions, function(val, text) {
    $('#mySelect').append( new Option(text,val) );
});

Se si desidera specificare se l'opzione a) è il valore selezionato di default e b) deve essere selezionato ora, è possibile passare altri due parametri:

    var defaultSelected = false;
    var nowSelected     = true;
    $('#mySelect').append( new Option(text,val,defaultSelected,nowSelected) );

1
Come si impostano le proprietà come la selezione di un valore predefinito?
Krishnan,

20
Mi piace questo meglio del "<option></option>"metodo; sembra sporco.
Josh M.

1
non funziona in ie8 .. ho appena provato e ho anche visto un altro commento su questo qui sotto.
briansol,

13

Con il plug-in: jQuery Selection Box . Puoi farlo:

var myOptions = {
        "Value 1" : "Text 1",
        "Value 2" : "Text 2",
        "Value 3" : "Text 3"
    }
    $("#myselect2").addOption(myOptions, false); 

11

Potresti voler cancellare DropDown prima $ ('# DropDownQuality'). Empty ();

Ho avuto il mio controller in MVC restituire un elenco di selezione con un solo elemento.

$('#DropDownQuality').append(
        $('<option></option>').val(data[0].Value).html(data[0].Text));    

7

Aggiungi l'elemento all'elenco all'inizio

$("#ddlList").prepend('<option selected="selected" value="0"> Select </option>');

Aggiungi elemento alla lista alla fine

$('<option value="6">Java Script</option>').appendTo("#ddlList");

Operazione a discesa comune (Ottieni, Imposta, Aggiungi, Rimuovi) utilizzando jQuery


1
Se si utilizzano virgolette doppie nei parametri delle opzioni, si chiuderà la funzione e si interromperà lo script. Passare .prepend("...") / $("...")a .prepend('...') / $('...')risolverà lo snippet.
Heraldmonkey,

4

Si prega di notare che la soluzione di @ Phrogz non funziona in IE 8 mentre quella di @ nickf funziona in tutti i principali browser. Un altro approccio è:

$.each(myOptions, function(val, text) {
    $("#mySelect").append($("&lt;option/&gt;").attr("value", val).text(text));
});

3

Puoi usare direttamente

$"(.ddlClassName").Html("<option selected=\"selected\" value=\"1\">1</option><option value=\"2\">2</option>")

-> Qui puoi usare la stringa diretta



0

usando jquery puoi usare

      this.$('select#myid').append('<option>newvalue</option>');

dove " myid " è l' id dell'elenco a discesa e newvalue è il testo che si desidera inserire.


0

Avevo bisogno di aggiungere tante opzioni ai menu a discesa quanti erano i menu a discesa sulla mia pagina. Quindi l'ho usato in questo modo:

function myAppender(obj, value, text){
    obj.append($('<option></option>').val(value).html(text));
}

$(document).ready(function() {
    var counter = 0;
    var builder = 0;
    // Get the number of dropdowns
    $('[id*="ddlPosition_"]').each(function() {
        counter++;
    });

    // Add the options for each dropdown
    $('[id*="ddlPosition_"]').each(function() {
        var myId = this.id.split('_')[1];

        // Add each option in a loop for the specific dropdown we are on
        for (var i=0; i<counter; i++) {
            myAppender($('[id*="ddlPosition_'+myId+'"]'), i, i+1);
        }
        $('[id*="ddlPosition_'+myId+'"]').val(builder);
        builder++;
    });
});

Ciò imposta dinamicamente i menu a discesa con valori come da 1 a n e seleziona automaticamente il valore per l'ordine in cui si trovava il menu a discesa (ovvero il 2 ° menu a discesa ha "2" nella casella, ecc.).

Era ridicolo che non potessi usare thiso this.Objecto $.objqualcosa del genere nel mio secondo .each(), tuttavia --- dovevo effettivamente ottenere l'ID specifico di quell'oggetto e quindi afferrare e passare l'intero oggetto alla mia funzione prima che si accodasse. Fortunatamente l'ID del mio menu a discesa è stato separato da un "_" e ho potuto afferrarlo. Non credo che avrei dovuto farlo, ma altrimenti continuavo a darmi eccezioni jQuery. Qualcos'altro alle prese con quello che ero potrebbe piacere sapere.


Perché stai incrementando il contatore in ciascuno? Sei nuovo di jquery? var counter = $ ('[id * = "ddlPosition _"]'). La lunghezza è meno dettagliata e più efficiente. Penso che tu abbia bisogno di un po 'più di esperienza prima di iniziare a pubblicare il tuo codice. Questo non è un codice di qualità della produzione in quanto è scritto male e troppo complesso per un compito così banale. Senza offesa ma c'è un motivo per cui hai 58 risposte e nessun voto positivo.
Atene Holloway,

Ovviamente hai frainteso quello che stavo creando. Il contatore è di aumentare il valore pubblicato nel menu a discesa, e ne avevo diversi con lo stesso ID, solo con un "_ ##" diverso alla fine, quindi .length () sarebbe stato impreciso. Questo è il motivo per "id * =" nel selettore.
Vapcguy,

Per quanto riguarda le mie altre risposte, generalmente propongo metodi più semplici ogni volta che sia possibile, e se le persone non fossero così esoteriche con il loro codice e scrivessero cose che erano più semplificate, le mie risposte avrebbero probabilmente più voti. Ma le persone vogliono apparire intelligenti e quindi non sceglieranno qualcosa di così semplice. Non mi sbaglio per volere semplicemente l'industria. Non mi piace nemmeno la risoluzione dei problemi o la costruzione di codice di altre persone che è ridicolmente più complesso di quanto debba essere.
Vapcguy,

Potrei anche avere più fiducia in $ (this) .length () in quel loop di più se qualcuno potesse spiegare perché l'invio di "$ (this)" invece dell'oggetto a myAppender non ha funzionato.
Vapcguy,

0

Supponiamo che la tua risposta sia "successData". Questo contiene un elenco che è necessario aggiungere come opzioni in un menu a discesa.

success: function (successData) {
var sizeOfData = successData.length;
if (sizeOfData == 0) {
    //    NO DATA, throw an alert ...
    alert ("No Data Found");
} else {
    $.each(successData, function(val, text) {
        mySelect.append(
            $('<option></option>').val(val).html(text)
        );
    });
} }

Questo funzionerebbe per te ....


-1

prova questa funzione:

function addtoselect(param,value){
    $('#mySelectBox').append('&lt;option value='+value+'&gt;'+param+'&lt;/option&gt;');
}
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.