Ajouter des options à un <select> en utilisant jQuery?

739

Quelle est la façon la plus simple d'ajouter un optionà une liste déroulante à l'aide de jQuery?

Est-ce que ça va marcher?

$("#mySelect").append('<option value=1>My option</option>');
Cliquez Upvote
la source
26
Ou utilisez $("#mySelect").html(....)pour remplacer les options actuelles par les nouvelles.
Dan Diplo

Réponses:

267

Cela n'a PAS fonctionné dans IE8 (mais l'a fait dans FF):

$("#selectList").append(new Option("option text", "value"));

Ce travail DID:

var o = new Option("option text", "value");
/// jquerify the DOM object 'o' so we can use the html method
$(o).html("option text");
$("#selectList").append(o);
Josh
la source
1
J'avais des problèmes avec IE8, mais votre code a fonctionné pour moi, merci!
Alexandre L Telles
Assurez-vous également que ce display: table;n'est PAS appliqué comme style à l'élément de sélection. Cela cassera le code js
Gundon
1
Si vous êtes intéressé, voici le bogue relatif à la façon dont Options ne fonctionne pas avec append () fonctionne dans FireFox, Chrome, mais pas dans IE: bugs.jquery.com/ticket/1641
JackDev
2
+1 - A fonctionné pour moi sans avoir à «jquerifier» l'objet. var o = new Option('option text', 'value'); o.innerHTML = 'option text'; document.getElementById('selectList').appendChild(o);
Aust
Il existe un moyen d'ajouter des valeurs "data-xxx" à cela?
Pedro Joaquín
817

Personnellement, je préfère cette syntaxe pour ajouter des options:

$('#mySelect').append($('<option>', {
    value: 1,
    text: 'My option'
}));

Si vous ajoutez des options à partir d'une collection d'éléments, vous pouvez effectuer les opérations suivantes:

$.each(items, function (i, item) {
    $('#mySelect').append($('<option>', { 
        value: item.value,
        text : item.text 
    }));
});
dule
la source
23
cela sera assez lent si vous ajoutez de nombreuses options, par rapport à la création d'une chaîne html et à son ajout
Cliquez sur Upvote
3
Fonctionne dans IE contrairement à beaucoup de solutions
DancesWithBamboo
3
@Ropitems={option1:{value:1,text:1},option2:{value:2,text:2}}
gamliela
4
merci @dule, mais comment puis-je sélectionner une nouvelle option par défaut?
Lord_JABA
11
{sélectionné: vrai}
jmadsen
115

Vous pouvez ajouter une option en utilisant la syntaxe suivante, vous pouvez également visiter l' option de traitement de manière dans jQuery pour plus de détails.

  1. $('#select').append($('<option>', {value:1, text:'One'}));

  2. $('#select').append('<option value="1">One</option>');

  3. var option = new Option(text, value); $('#select').append($(option));

Dipu
la source
1
le premier doit être remplacé par $ ("# SectionNames"). append ($ ('<option>', {valeur: 1, texte: "one"})
EthenHY
1
Le second a un attribut incorrect dans la balise d'option ( valueau lieu de val). Le bon code devrait être$('select').append('<option value="1">One</option>');
todd
Merci Dipu :))
Fox
45

Si le nom ou la valeur de l'option est dynamique, vous ne voudrez pas vous soucier de lui échapper des caractères spéciaux; dans ce cas, vous préférerez peut-être des méthodes DOM simples:

var s= document.getElementById('mySelect');
s.options[s.options.length]= new Option('My option', '1');
bobince
la source
1
Ça ne me semble pas si simple !!
Cliquez sur Upvote le
27
C'est simple en termes javascript, jquery a rendu les choses trop faciles pour les gens
DWolf
document.getElementById ('mySelect'). add (new Option ('My option', '1')); // si IE8 ou mieux
Hafthor
34

Option 1-

Vous pouvez essayer ceci-

$('#selectID').append($('<option>',
 {
    value: value_variable,
    text : text_variable
}));

Comme ça-

for (i = 0; i < 10; i++)
{ 
     $('#mySelect').append($('<option>',
     {
        value: i,
        text : "Option "+i 
    }));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<select id='mySelect'></select>

Option 2-

Ou essayez ceci-

$('#selectID').append( '<option value="'+value_variable+'">'+text_variable+'</option>' );

Comme ça-

for (i = 0; i < 10; i++)
{ 
     $('#mySelect').append( '<option value="'+i+'">'+'Option '+i+'</option>' );
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<select id='mySelect'></select>

Abrar Jahin
la source
20

C'est très simple:

$('#select_id').append('<option value="five" selected="selected">Five</option>');

ou

$('#select_id').append($('<option>', {
                    value: 1,
                    text: 'One'
                }));
Yesuus Yesuus
la source
18

Ça marche bien.

Si vous ajoutez plusieurs éléments d'option, je recommanderais d'effectuer l'ajout une fois plutôt que d'effectuer un ajout sur chaque élément.

Russ Cam
la source
18

pour une raison quelconque, faire $("#myselect").append(new Option("text", "text"));ne fonctionne pas pour moi dans IE7 +

Je devais utiliser $("#myselect").html("<option value='text'>text</option>");

Aurelio De Rosa
la source
J'utilise cette même syntaxe (nouvelle option (...) sur le navigateur Android Chrome (sur un téléphone) et ça ne marche pas non plus.
raddevus
15

Pour améliorer les performances, essayez de ne modifier le DOM qu'une seule fois, d'autant plus si vous ajoutez de nombreuses options.

var html = '';

for (var i = 0, len = data.length; i < len; ++i) {
    html.join('<option value="' + data[i]['value'] + '">' + data[i]['label'] + '</option>');
}           

$('#select').append(html);
John Magnolia
la source
1
pour améliorer les performances que vous devez utiliser string.join()pour concaténer des chaînes
mfeineis
1
C'est une excellente solution. J'ai eu un problème avec "join ()" dans l'exemple n'étant pas une fonction valide, mais cette solution vous permet d'utiliser une "promesse" jQuery pour déterminer quand toutes les options ont été ajoutées et que le DOM a terminé la mise à jour. Avec les autres solutions qui ajoutent des options une par une, cela ne peut pas être fait aussi facilement. Remplacez la dernière ligne de l'exemple par ce qui suit pour effectuer une action uniquement une fois la modification DOM terminée: $ .when ($ ('# select'). Append (html)). Done (function () {callSomeFunctionThatRequiresOptionsToBeSet ()} );
Americus
13
$('#mySelect').empty().append('<option value=1>My option</option>').selectmenu('refresh');
szpapas
la source
8
Sauf erreur, cette solution nécessite non seulement jQuery, mais aussi jQueryUI. selectmenu()ne fait pas partie du noyau jQuery et est un widget jQueryUI . Cela en fait une solution assez lourde, non?
tatlar
13

J'aime utiliser une approche non jquery:

mySelect.add(new Option('My option', 1));
caiohamamura
la source
3
J'aime que ce soit non-jquery;) Ne voyez pas ça trop souvent
Dakkaron
3
Oui, et bien que je ne puisse pas remettre en question le pouvoir jquery, il y a des cas où cela ne simplifie pas les choses.
caiohamamura
11

Vous pouvez ajouter des options dynamiquement dans la liste déroulante comme indiqué dans l'exemple ci-dessous. Ici, dans cet exemple, j'ai pris les données du tableau et lié ces valeurs au tableau déroulant comme indiqué dans la capture d'écran de sortie

Production:

entrez la description de l'image ici

var resultData=["Mumbai","Delhi","Chennai","Goa"]
$(document).ready(function(){
   var myselect = $('<select>');
     $.each(resultData, function(index, key) {
	     myselect.append( $('<option></option>').val(key).html(key) );
       });
      $('#selectCity').append(myselect.html());
});
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js">
</script>

<select  id="selectCity">

</select>

GSB
la source
9

Non mentionné dans une réponse mais utile dans le cas où vous souhaitez que cette option soit également sélectionnée, vous pouvez ajouter:

var o = new Option("option text", "value");
o.selected=true;
$("#mySelect").append(o);
Eduard Florinescu
la source
1
Merci, j'avais besoin de présélectionner une option générée à partir de json et cela a bien fonctionné.
Georg Patscheider du
9
var select = $('#myselect');
var newOptions = {
                'red' : 'Red',
                'blue' : 'Blue',
                'green' : 'Green',
                'yellow' : 'Yellow'
            };
$('option', select).remove();
$.each(newOptions, function(text, key) {
    var option = new Option(key, text);
    select.append($(option));
});
MaxEcho
la source
5

Il y a deux façons. Vous pouvez utiliser l'un des deux.

Première:

$('#waterTransportationFrom').append('<option value="select" selected="selected">Select From Dropdown List</option>');

Seconde:

$.each(dataCollecton, function(val, text) {            
    options.append($('<option></option>').val(text.route).html(text.route));
});
Dulith De Costa
la source
3

Si vous souhaitez insérer la nouvelle option à un index spécifique dans la sélection:

$("#my_select option").eq(2).before($('<option>', {
    value: 'New Item',
    text: 'New Item'
}));

Cela insérera le "Nouvel élément" comme 3e élément dans la sélection.

ATOzTOA
la source
3

Vous pouvez ajouter et définir l'attribut Value avec du texte:

$("#id").append($('<option></option>').attr("value", '').text(''));
$("#id").append($('<option></option>').attr("value", '4').text('Financial Institutions'));
Ahmed
la source
3

Nous avons trouvé un problème lorsque vous ajoutez une option et utilisez jquery validate. Vous devez cliquer sur un élément dans la liste de sélection multiple. Vous allez ajouter ce code pour gérer:

$("#phonelist").append("<option value='"+ 'yournewvalue' +"' >"+ 'yournewvalue' +"</option>");

$("#phonelist option:selected").removeAttr("selected"); // add to remove lase selected

$('#phonelist option[value=' + 'yournewvalue' + ']').attr('selected', true); //add new selected

https://i.stack.imgur.com/HOjIY.png

Peang Peang
la source
3

Que dis-tu de ça

var numbers = [1, 2, 3, 4, 5];
var option = '';

for (var i=0;i<numbers.length;i++){
     option += '<option value="'+ numbers[i] + '">' + numbers[i] + '</option>';
    }

    $('#items').append(option);
Mcfaith
la source
2

Ce ne sont que quelques points rapides pour de meilleures performances

toujours lorsque vous avez affaire à de nombreuses options, créez une grande chaîne, puis ajoutez-la au "select" pour de meilleures performances

fg

var $ mySelect = $ ('# mySelect'); var str = '';

$.each(items, function (i, item) {
    // IMPORTANT: no selectors inside the loop (for the best performance)
    str += "<option value='" + item.value + "'> " + item.text + "</option>";
});
// you built a big string

$mySelect.html(str); // <-- here you add the big string with a lot of options into the selector.
$mySelect.multiSelect('refresh');

Même plus vite

var str = ""; 
for(var i; i = 0; i < arr.length; i++){
    str += "<option value='" + item[i].value + "'> " + item[i].text + "</option>";
}    
$mySelect.html(str);
$mySelect.multiSelect('refresh');
Hatim
la source
2
$(function () {
     var option = $("<option></option>");
     option.text("Display text");
     option.val("1");
     $("#Select1").append(option);
});

Si vous obtenez des données d'un objet, transférez simplement cet objet pour qu'il fonctionne ...

$(function (product) {
     var option = $("<option></option>");
     option.text(product.Name);
     option.val(product.Id);
     $("#Select1").append(option);
});

Le nom et l'id sont des noms de propriétés d'objet ... vous pouvez donc les appeler comme bon vous semble ... Et bien sûr, si vous avez un tableau ... vous voulez créer une fonction personnalisée avec pour la boucle for ... document prêt ... Santé

Robert Nol
la source
2

Basé sur la réponse de dule pour avoir ajouté une collection d'articles, un doublurefor...in fera également des merveilles:

let cities = {'ny':'New York','ld':'London','db':'Dubai','pk':'Beijing','tk':'Tokyo','nd':'New Delhi'};

for(let c in cities){$('#selectCity').append($('<option>',{value: c,text: cities[c]}))}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<select  id="selectCity"></select>

Les valeurs d'objet et les index sont affectés aux options. Cette solution fonctionne même dans l'ancien jQuery (v1.4) !

CPHPython
la source
1

si vous avez optgroup dans select , vous avez une erreur dans DOM.

Je pense que le meilleur moyen:

$("#select option:last").after($('<option value="1">my option</option>'));
d-velop
la source
1

Vous pouvez essayer le code ci-dessous pour ajouter à l'option

  <select id="mySelect"></select>

    <script>
          $("#mySelect").append($("<option></option>").val("1").html("My enter code hereoption"));
    </script>
Muhammad Kamal
la source
1
$('#select_id').append($('<option>',{ value: v, text: t }));
Cris
la source
1

C'est ainsi que je l'ai fait, avec un bouton pour ajouter chaque balise de sélection.

$(document).on("click","#button",function() {
   $('#id_table_AddTransactions').append('<option></option>')
}
Ronald Valera Santana
la source
Est-ce que ça devrait être$(document).ready(function(){ $("#button").click(function() { $('#id_table_AddTransactions').append('<option></option>'); }); });
Bariq Dharmawan
Oui, vous avez raison. Ma réponse ne comprenait pas la déclaration prête parce que, je me suis concentré sur ce qui a résolu le problème.
Ronald Valera Santana
1

Vous pouvez le faire dans ES6:

$.each(json, (i, val) => {
    $('.js-country-of-birth').append(`<option value="${val.country_code}"> ${val.country} </option>`);
  });
idiglove
la source
1

Si quelqu'un vient ici à la recherche d'un moyen d'ajouter des options avec des propriétés de données

Utiliser attr

var option = $('<option>', { value: 'the_value', text: 'some text' }).attr('family', model.family);

Utilisation des données - version ajoutée 1.2.3

var option = $('<option>', { value: 'the_value', text: 'some text' }).data('misc', 'misc-value);
masmerino
la source