Quelle est la meilleure méthode pour ajouter des options à un <select>
objet JavaScript à l'aide de jQuery?
Je cherche quelque chose pour lequel je n'ai pas besoin d'un plugin, mais je serais é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 / simple:
Ceci est une version nettoyée et simplifiée de matdumsa :
$.each(selectValues, function(key, value) {
$('#mySelect')
.append($('<option>', { value : key })
.text(value));
});
Modifications par rapport à matdumsa: (1) a supprimé la balise close pour l'option à l'intérieur de append () et (2) a déplacé les propriétés / attributs dans une carte comme deuxième paramètre de append ().
javascript
jquery
arrays
html-select
Darryl Hein
la source
la source
value
étant une chaîne (et codée en dur), elle n'a pas besoin d'être citée.Réponses:
Identique aux autres réponses, de manière jQuery:
la source
$("#mySelect")
à un 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 sur artzstudio.com/2009/04/jquery-performance-rules/…var mySelect = $("#mySelect") outside of the
chaque boucle. Ce serait beaucoup plus efficace. Voir la réponse de Carl ciattr
ettext
sont en fait des méthodes de l'$('<option/>')
objetDe cette façon, vous "touchez le DOM" une seule fois.
Je ne sais pas si la dernière ligne peut être convertie en $ ('# mySelect'). Html (output.join ('')) parce que je ne connais pas les internes de jQuery (peut-être qu'il fait un peu d'analyse dans le html () méthode)la source
key
a contient des guillemets>, <
.C'est un peu plus rapide et plus propre.
la source
jQuery
JavaScript vanille
la source
Option
objet auparavant. Est-ce intégré à tous les navigateurs?new Option
, mais j'ai constaté que cela ne fonctionnait pas dans IE6 et 7. Je n'ai pas de raison, mais la plupart des options jQuery complètes ont fonctionné.new Option('display', value, true)
new Option('display', value, true, true)
( javascriptkit.com/jsref/select.shtml )Si vous n'avez pas à prendre en charge les anciennes versions d'IE, l'utilisation du
Option
constructeur est clairement la voie à suivre, une solution lisible et efficace :Sa fonctionnalité est équivalente à, mais plus propre que:
la source
Cela semble plus agréable, offre une lisibilité, mais est plus lent que les autres méthodes.
Si vous voulez de la vitesse, la méthode la plus rapide (testée!) Est celle-ci, en utilisant un tableau, pas une concaténation de chaînes, et en utilisant un seul appel d'ajout.
la source
Un raffinement des plus anciens réponse de @ joshperry :
Il semble que plaine. Append fonctionne également comme prévu,
ou plus court,
la source
$.weakmap
pour permettreGC
map()
construction, combinée avec la propriété d'append()
ajouter correctement un tableau d'objets!Toutes ces réponses semblent inutilement compliquées. Tout ce dont tu as besoin c'est:
C'est complètement compatible avec tous les navigateurs.
la source
new Option(value, key);
? L' ordre des paramètres est Options (text_visible_part, value_behind_the_scenes).Soyez prévenu ... J'utilise jQuery Mobile 1.0b2 avec PhoneGap 1.0.0 sur un téléphone Android 2.2 (Cyanogen 7.0.1) (T-Mobile G2) et je n'ai pas pu faire fonctionner la méthode .append (). J'ai dû utiliser .html () comme suit:
la source
J'ai fait quelques tests et cela, je crois, fait le travail le plus rapidement. : P
la source
Il existe une approche utilisant l'approche Microsoft Templating qui est actuellement proposée pour inclusion dans le noyau jQuery. Il y a plus de puissance dans l'utilisation des modèles, donc pour le scénario le plus simple, ce n'est peut-être pas la meilleure option. Pour plus de détails, consultez l'article de Scott Gu décrivant les fonctionnalités.
Commencez par inclure le fichier js de modèles, disponible sur github .
Configurer ensuite un modèle
Ensuite, avec vos données, appelez la méthode .render ()
J'ai blogué cette approche plus en détail.
la source
J'ai créé quelque chose comme ça, en chargeant un élément de liste déroulante via Ajax . La réponse ci-dessus est également acceptable, mais il est toujours bon d'avoir le moins de modifications DOM possible pour de meilleures performances.
Ainsi, plutôt que d'ajouter chaque élément dans une boucle, il est préférable de collecter les éléments dans une boucle et de les ajouter une fois qu'elle est terminée.
Ajoutez-le,
ou encore mieux
la source
La manière la plus simple est:
la source
La plupart des autres réponses utilisent la
each
fonction pour parcourir leselectValues
. Cela nécessite que append soit appelé pour chaque élément et une redistribution est déclenchée lorsque chacun est ajouté individuellement.La mise à jour de cette réponse à une méthode fonctionnelle plus idiomatique (en utilisant JS moderne) peut être formée pour appeler
append
une seule fois, avec un tableau d'option
éléments créés en utilisant la carte et unOption
constructeur d'élément.L'utilisation d'un
Option
élément DOM devrait réduire la surcharge des appels de fonction car l'option
élément n'a pas besoin d'être mis à jour après la création et la logique d'analyse de jQuery n'a pas besoin de s'exécuter.Cela peut être simplifié davantage si vous créez une fonction utilitaire d'usine qui va créer un objet option:
Ensuite, cela peut être fourni directement à
map
:Formulation précédente
Parce que
append
permet également passer des valeurs comme un nombre variable d'arguments, nous pouvons créer au préalable la liste desoption
éléments carte et les ajouter comme arguments dans un seul appel à l'aideapply
.Il ressemble à cela dans les versions ultérieures de jQuery,
append
accepte également un argument de tableau et cela peut être quelque peu simplifié:la source
Cela fonctionne bien avec jQuery 1.4.1.
Pour un article complet sur l'utilisation des listes dynamiques avec ASP.NET MVC et jQuery, visitez:
Listes de sélection dynamique avec MVC et jQuery
la source
Il y a un problème de tri avec cette solution dans Chrome (jQuery 1.7.1) (Chrome trie les propriétés des objets par nom / numéro?) Donc, pour garder l'ordre (oui, c'est un abus d'objet), j'ai changé ceci:
pour ça
puis le $ .each ressemblera à:
la source
Plutôt que de répéter le même code partout, je suggère qu'il est plus souhaitable d'écrire votre propre fonction jQuery comme:
Ensuite, pour ajouter une option, procédez comme suit:
la source
Vous pouvez simplement parcourir votre tableau json avec le code suivant
$('<option/>').attr("value","someValue").text("Option1").appendTo("#my-select-id");
la source
Bien que les réponses précédentes soient toutes des réponses valides - il peut être conseillé de les ajouter à un documentFragmnet d'abord, puis d'ajouter ce fragment de document en tant qu'élément après ...
Voir les réflexions de John Resig sur la question ...
Quelque chose dans le sens de:
la source
$.each
est plus lent qu'unfor
boucle$("#mySelect").append();
La meilleure solution est donc la suivante
Si les données JSON
resp
sontl'utiliser comme
la source
Encore une autre façon de procéder:
la source
$('#mySelect')
puis refactorisé la réponse @rocktheroad ... peu importe, c'est la solution la plus pratiqueCela ne manipule le DOM qu'une seule fois après la première construction d'une chaîne géante.
la source
$("#myselect").empty().append(opts);
pargetElementById('myselect').innerHtml = opts;
C'est ce que j'ai fait avec les tableaux bidimensionnels: la première colonne est l'élément i, ajoutez
innerHTML
-le à<option>
. La deuxième colonne est RECORD_ID i, ajouter àvalue
la<option>
:PHP
JavaScript / Ajax
la source
Un plugin jQuery peut être trouvé ici: Boîtes de sélection à remplissage automatique utilisant jQuery et AJAX .
la source
J'ai trouvé que c'est simple et fonctionne très bien.
la source
Le format JSON:
Et le code jQuery pour remplir les valeurs pour le succès Dropdown on Ajax:
la source
En utilisant la fonction $ .map (), vous pouvez le faire de manière plus élégante:
la source
la source
Définissez votre identifiant de sélection HTML dans la ligne suivante ci-dessous. Ici
mySelect
est utilisé comme id de l'élément de sélection.puis récupérez l'objet correspondant aux selectValues dans ce scénario et définissez-le sur jquery pour chaque boucle. Il utilisera la valeur et le texte des objets en conséquence et les ajoutera aux sélections d'options comme suit.
Cela affichera le texte comme liste d'options lorsque la liste déroulante est sélectionnée et une fois le texte sélectionné, la valeur du texte sélectionné sera utilisée.
Par exemple.
"1": "test 1", "2": "test 2",
Menu déroulant,
nom d'affichage: test 1 -> la valeur est 1 nom d'affichage: test 2 -> la valeur est 2
la source
En fait, pour obtenir des performances améliorées, il est préférable de faire la liste d'options séparément et de l'ajouter pour sélectionner l'id.
http://learn.jquery.com/performance/append-outside-loop/
la source