1462 votes

Quelle est la meilleure façon d'ajouter des options à une sélection d'objet JavaScript avec jQuery ?

Quelle est la meilleure méthode pour ajouter des options à un fichier <select> à partir d'un objet JavaScript en utilisant jQuery ?

Je cherche quelque chose qui ne nécessite pas de plugin, mais je suis également intéressé par les plugins qui existent.

C'est ce que j'ai fait :

selectValues = { "1": "test 1", "2": "test 2" };

for (key in selectValues) {
  if (typeof (selectValues[key] == 'string') {
    $('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>');
  }
}

Une solution propre et simple :

Il s'agit d'une version nettoyée et simplifiée version de matdumsa :

$.each(selectValues, function(key, value) {
     $('#mySelect')
          .append($('<option>', { value : key })
          .text(value));
});

Modifications par rapport à celles de matdumsa : (1) suppression de la balise close pour l'option dans append() et (2) déplacement des propriétés/attributs dans une map en tant que second paramètre de append().

4 votes

Peut-être de l'aide : texotela.co.uk/code/jquery/select (c'était une aide pour moi après que je sois tombé sur cette question)

2 votes

La version nettoyée ci-dessus ne fonctionne qu'avec Jquery 1.4+. Pour les versions plus anciennes, utilisez celle qui se trouve dans la réponse de matdumsa

0 votes

{ value : key } devrait être { "value" : key } comme vu dans la réponse de matdumsa.

1461voto

matdumsa Points 6779

La même chose que les autres réponses, à la manière de jQuery :

$.each(selectValues, function(key, value) {   
     $('#mySelect')
         .append($("<option></option>")
                    .attr("value", key)
                    .text(value)); 
});

108 votes

Je commencerais par assigner $("#mySelect") à une var, sinon appeler $("#mySelect") à chaque fois dans la boucle est très inutile, tout comme la mise à jour du DOM. Voir les points #3 et #6 à artzstudio.com/2009/04/jquery-performance-rules/

290voto

gpilotino Points 5644
var output = [];

$.each(selectValues, function(key, value)
{
  output.push('<option value="'+ key +'">'+ value +'</option>');
});

$('#mySelect').html(output.join(''));

De cette façon, vous ne "touchez le DOM" qu'une seule fois.

Je ne suis pas sûr que la dernière ligne puisse être convertie en $('#mySelect').html(output.join('')) car je ne connais pas les mécanismes internes de jQuery (peut-être que la méthode html() effectue une analyse syntaxique).

20 votes

Votre méthode est évidemment plus rapide que la réponse "correcte" ci-dessus, car elle utilise également moins de jQuery.

19 votes

Cela se casse si le key a des citations ou >, < en elle.

214voto

rocktheroad Points 1203

Cette méthode est légèrement plus rapide et plus propre.

var selectValues = {
  "1": "test 1",
  "2": "test 2"
};
var $mySelect = $('#mySelect');
//
$.each(selectValues, function(key, value) {
  var $option = $("<option/>", {
    value: key,
    text: value
  });
  $mySelect.append($option);
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="mySelect"></select>

47 votes

Je pense que ce serait une meilleure idée de mettre en cache ` $('#mySelect')` , de sorte que vous ne cherchiez qu'une seule fois avant la boucle. Actuellement, il cherche l'élément dans le DOM pour chaque option.

109voto

Carl Hörberg Points 2786

jQuery

var list = $("#selectList");
$.each(items, function(index, item) {
  list.append(new Option(item.text, item.value));
});

Vanilla JavaScript

var list = document.getElementById("selectList");
for(var i in items) {
  list.add(new Option(items[i].text, items[i].value));
}

40voto

Nickolay Points 14384

Si vous n'avez pas à prendre en charge d'anciennes versions d'IE, l'utilisation de l'option Option Constructeur est clairement la voie à suivre, une solution lisible et efficace :

$(new Option('myText', 'val')).appendTo('#mySelect');

Il est équivalent en fonctionnalité à, mais plus propre que :

$("<option></option>").attr("value", "val").text("myText")).appendTo('#mySelect');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X