Comment ajouter des options à une DropDownList à l'aide de jQuery?

291

Comme le dit la question, comment ajouter une nouvelle option à une DropDownList à l'aide de jQuery?

Merci

la chair
la source
Juste curieux, pourquoi cette question a été rejetée? Probablement parce qu'il ne montre aucun extrait de code :)
shasi kanth

Réponses:

451

Sans utiliser de plugins supplémentaires,

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

Si vous aviez beaucoup d'options ou que ce code devait être exécuté très fréquemment, vous devriez envisager d'utiliser un DocumentFragment au lieu de modifier le DOM plusieurs fois inutilement. Pour seulement quelques options, je dirais que cela n'en vaut pas la peine.

------------------------------- Ajoutée ------------------ --------------

DocumentFragmentest une bonne option pour l'amélioration de la vitesse, mais nous ne pouvons pas créer d'élément d'option en utilisant document.createElement('option')puisque IE6 et IE7 ne le prennent pas en charge.

Ce que nous pouvons faire, c'est créer un nouvel élément de sélection, puis ajouter toutes les options. Une fois la boucle terminée, ajoutez-la à l'objet DOM réel.

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

De cette façon, nous ne modifierons le DOM qu'une seule fois!

nickf
la source
8
Les paramètres de la méthode sont un peu trompeurs, la fonction (val, texte) doit être fonction (index, option) par exemple. Fonctionne bien sinon.
mbillard
14
@Crossbrowser: Je ne suis pas d'accord - valet textdécris en fait les variables et leur utilisation.
nickf
1
pour cet exemple seulement, mais en tant que méthode à usage général, ces variables sont trompeuses (cela ne m'a donné aucune idée de la façon d'utiliser cette méthode). Cependant, je dirai que la réponse ne concernait pas l'utilisation de la méthode $ .each.
mbillard
1
J'utilisais auparavant mySelect.append(new Option(text, val));, ce qui ne fonctionnait pas dans IE8. Je devais passer à @ nickfmySelect.append($('<option></option>').val(val).html(text));
Matthew Clark
5
@briansol:.attr('selected', true|false)
nickf
167

Sans plug-in, cela peut être plus facile sans utiliser autant de jQuery, au lieu d'aller un peu plus à l'ancienne:

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

Si vous souhaitez spécifier si l'option a) est la valeur sélectionnée par défaut et b) doit être sélectionnée maintenant, vous pouvez passer deux paramètres supplémentaires:

    var defaultSelected = false;
    var nowSelected     = true;
    $('#mySelect').append( new Option(text,val,defaultSelected,nowSelected) );
Phrogz
la source
1
Comment définissez-vous les propriétés comme la sélection d'une valeur par défaut?
Krishnan
20
J'aime mieux celui-ci que la "<option></option>"méthode; cela semble sale.
Josh M.
1
ne fonctionne pas dans ie8 .. vient de l'essayer et a également vu un autre commentaire à ce sujet ci-dessous.
briansol
13

Avec le plugin: Boîte de sélection jQuery . Tu peux le faire:

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

Vous voudrez peut-être d'abord effacer votre DropDown $ ('# DropDownQuality'). Empty ();

J'ai eu mon contrôleur dans MVC renvoyer une liste de sélection avec un seul élément.

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

Ajouter un élément à la liste au début

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

Ajouter un élément à la liste à la fin

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

Opération de liste déroulante commune (Get, Set, Add, Remove) à l'aide de jQuery

Zakaria
la source
1
Si vous utilisez des guillemets doubles dans les paramètres de votre option, ils fermeront la fonction et interrompront le script. Changer .prepend("...") / $("...")pour .prepend('...') / $('...')corriger l'extrait de code.
Heraldmonkey
4

Veuillez noter que la solution de @ Phrogz ne fonctionne pas dans IE 8 tandis que celle de @ nickf fonctionne dans tous les principaux navigateurs. Une autre approche est:

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

Vous pouvez utiliser directement

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

-> Ici, vous pouvez utiliser une chaîne directe

Geai
la source
0

en utilisant jquery, vous pouvez utiliser

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

où " myid " est l' id de la liste déroulante et newvalue est le texte que vous souhaitez insérer.

côtelettes
la source
0

Je devais ajouter autant d'options aux listes déroulantes qu'il y avait de listes déroulantes sur ma page. Je l'ai donc utilisé de cette façon:

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

Cela a créé dynamiquement des listes déroulantes avec des valeurs comme 1 à n, et a automatiquement sélectionné la valeur de l'ordre dans lequel la liste déroulante était (c.-à-d. Que la deuxième liste déroulante a obtenu "2" dans la case, etc.).

C'était ridicule que je ne puisse pas utiliser thisou this.Objectou $.objou quelque chose comme ça dans mon 2e .each(), cependant --- j'ai dû en fait obtenir l'ID spécifique de cet objet, puis saisir et transmettre cet objet entier à ma fonction avant qu'il ne soit ajouté. Heureusement, l'ID de ma liste déroulante a été séparée par un "_" et j'ai pu la saisir. Je ne pense pas que j'aurais dû le faire, mais cela me donnait des exceptions jQuery dans le cas contraire. Quelque chose que les autres aux prises avec ce que j'étais pourrait aimer savoir.

vapcguy
la source
Pourquoi incrémentez-vous le compteur dans chacun? Êtes-vous nouveau sur jquery? var counter = $ ('[id * = "ddlPosition _"]'). La longueur est moins détaillée et plus efficace. Je pense que vous avez besoin d'un peu plus d'expérience avant de commencer à publier votre code. Ce n'est pas un code de qualité de production car il est mal écrit et trop complexe pour une tâche aussi triviale. Aucune infraction mais il y a une raison pour laquelle vous avez 58 réponses et aucun vote positif.
Athens Holloway
Vous avez manifestement mal compris ce que je créais. Le compteur consiste à incrémenter la valeur affichée dans la liste déroulante, et j'en ai eu plusieurs avec le même ID, juste avec un "_ ##" différent à la fin, donc .length () aurait été inexact. C'est la raison de "id * =" dans le sélecteur.
vapcguy
Quant à mes autres réponses, je préconise généralement des méthodes plus simples dans la mesure du possible, et si les gens n'étaient pas aussi ésotériques avec leur codage et écrivaient des choses plus simplifiées, mes réponses auraient probablement plus de votes. Mais les gens veulent se faire paraître intelligents et donc ils ne choisiront pas quelque chose d'aussi simple. Cela ne me fait pas de tort de vouloir simplement l'industrie. Je n'aime pas non plus résoudre les problèmes ou développer le code d'autres personnes qui est ridiculement plus complexe qu'il ne devrait l'être.
vapcguy
Je pourrais également avoir plus confiance en $ (this) .length () dans cette boucle davantage si quelqu'un pouvait expliquer pourquoi l'envoi de "$ (this)" au lieu de l'objet à myAppender ne fonctionnait pas.
vapcguy
0

Imaginons que votre réponse soit "successData". Il contient une liste que vous devez ajouter comme options dans un menu déroulant.

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

Cela fonctionnerait pour vous ....

Dulith De Costa
la source
-1

essayez cette fonction:

function addtoselect(param,value){
    $('#mySelectBox').append('&lt;option value='+value+'&gt;'+param+'&lt;/option&gt;');
}
Sebastian Mach
la source