jQuery: Meilleure pratique pour remplir la liste déroulante?

269

L'exemple que je vois publié tout le temps semble être sous-optimal, car il implique la concaténation de chaînes, ce qui ne semble donc pas jQuery. Cela ressemble généralement à ceci:

$.getJSON("/Admin/GetFolderList/", function(result) {
    for (var i = 0; i < result.length; i++) {
        options += '<option value="' + result[i].ImageFolderID + '">' + result[i].Name + '</option>';
    }
});

Y a-t-il une meilleure façon?

Jeff Putz
la source

Réponses:

448

Andreas Grech était assez proche ... c'est en fait this(notez la référence à la thisplace de l'élément dans la boucle):

var $dropdown = $("#dropdown");
$.each(result, function() {
    $dropdown.append($("<option />").val(this.ImageFolderID).text(this.Name));
});
Jeff Putz
la source
5
L'histoire ancienne ici, je le sais, mais pour les googleurs comme moi qui viennent de tomber sur ça maintenant, ne serait-il pas encore plus rapide si vous cloniez un <option/>élément au lieu de créer chacun?
faneuses
2
Je ne pense pas ... de toute façon, cela va instancier un nouvel élément.
quillbreaker
9
Agréable! Bien que je pense que l'exemple pourrait être plus clair si l'élément était nommé "#dropdown" ou plus, car il reflète mieux l'élément parent réel des options.
Anders
4
Je pense que la construction de toutes les options en mémoire (avec une variable de chaîne) en premier et ensuite l'ajout de cette chaîne au contrôle de sélection parent devrait être plus efficace, car cela ne provoquera qu'une seule mise en page
Wint
1
Désolé si vous recevez des notifications et ne voyez rien. J'ai supprimé mes commentaires précédents. Parce que j'ai mieux compris la réponse après avoir lu mes propres commentaires :)
ivange
71
$.getJSON("/Admin/GetFolderList/", function(result) {
    var options = $("#options");
    //don't forget error handling!
    $.each(result, function(item) {
        options.append($("<option />").val(item.ImageFolderID).text(item.Name));
    });
});

Ce que je fais ci-dessus est de créer un nouvel <option>élément et de l'ajouter à la optionsliste (en supposant que optionsl'ID d'un élément déroulant.

PS Mon javascript est un peu rouillé donc la syntaxe n'est peut-être pas parfaite

Andreas Grech
la source
1
C'est assez proche et cela m'a mis dans la bonne direction. Voir ma réponse ci-dessous.
Jeff Putz
Doux! vraiment utile, je remplis mes listes déroulantes depuis longtemps et ça n'a toujours pas l'air professionnel
Kyle
41

Bien sûr - créez optionsun tableau de chaînes et utilisez .join('')plutôt que +=chaque fois dans la boucle. Légère augmentation des performances lors du traitement d'un grand nombre d'options ...

var options = [];
$.getJSON("/Admin/GetFolderList/", function(result) {
    for (var i = 0; i < result.length; i++) {
        options.push('<option value="',
          result[i].ImageFolderID, '">',
          result[i].Name, '</option>');
    }
    $("#theSelect").html(options.join(''));
});

Oui. Je travaille toujours avec des cordes tout le temps. Croyez-le ou non, c'est le moyen le plus rapide de créer un fragment DOM ... Maintenant, si vous n'avez que quelques options, cela n'aura pas vraiment d'importance - utilisez la technique démontrée par Dreas si vous aimez le style. Mais gardez à l'esprit que vous invoquez les i*2heures de l' analyseur HTML interne du navigateur , plutôt qu'une seule fois, et modifiez le DOM à chaque fois dans la boucle ... avec un nombre suffisant d'options. vous finirez par payer pour cela, en particulier sur les anciens navigateurs.

Remarque: Comme le souligne Justice, cela s'effondrera si ImageFolderIDet Namen'est pas codé correctement ...

Shog9
la source
1
Vous devez respectivement coder result[i].ImageFolderIDet en result[i].Nametant que valeur d'attribut html et texte html. Je ne suppose pas qu'ils proviennent du serveur pré-encodé, car je suppose que le serveur retourne json, pas json bâtard.
yfeldblum
@Justice: vous avez raison, mais comme l'exemple de Jeff l'a omis, je l'ai fait aussi. Ajoutera cependant une note, merci.
Shog9
1
J'ai voté pour la réponse donnée par @Ribibald parce que bizarrement, sur la base de ce test que j'ai rencontré, il s'avère que la concaténation est plus rapide que joindans pratiquement tous les navigateurs.
déversoir
24

Ou peut-être:

var options = $("#options");
$.each(data, function() {
    options.append(new Option(this.text, this.value));
});
xinthink
la source
6
var myOptions = {val1: 'text1', val2: 'text2'}; $ .each (myOptions, fonction (val, texte) {$ ('# mySelect'). append (nouvelle option (texte, val));});
The Demz
19

Le moyen le plus rapide est le suivant:

 $.getJSON("/Admin/GetFolderList/", function(result) {
        var optionsValues = '<select>';
        $.each(result, function(item) {
            optionsValues += '<option value="' + item.ImageFolderID + '">' + item.Name + '</option>';
        });
        optionsValues += '</select>';
        var options = $('#options');
        options.replaceWith(optionsValues);
    });

Selon ce lien, c'est le moyen le plus rapide car vous enveloppez tout dans un seul élément lorsque vous effectuez tout type d'insertion DOM.

Ricibald
la source
cependant avec replaceWith vous remplacez la sélection dans dom et perdez les événements déjà attachés à la sélection, je pense que ce serait mieux avec options.html (optionsValue) si vous voulez préserver les événements
Geomorillo
12

J'ai trouvé que cela fonctionnait à partir du site jquery

$.getJSON( "/Admin/GetFolderList/", function( data ) {
  var options = $("#dropdownID");
  $.each( data, function(key, val) {
    options.append(new Option(key, val));
  });
});
binshi
la source
5

J'ai lu que l'utilisation de fragments de document est performante car elle évite la redistribution des pages à chaque insertion d'élément DOM, elle est également bien prise en charge par tous les navigateurs (même IE 6).

var fragment = document.createDocumentFragment();

$.each(result, function() {
  fragment.appendChild($("<option />").val(this.ImageFolderID).text(this.Name)[0]);
});

$("#options").append(fragment);

J'ai d'abord lu à ce sujet dans le cours sur les meilleures pratiques JavaScript de CodeSchool .

Voici une comparaison des différentes approches , merci à l'auteur.

Dapeng Li
la source
C'est certainement la voie rapide. Encore mieux - sautez jQuery avec tout cela ensemble:result.forEach(function(el){var option=document.createElement('option').option.textContent=el.name;option.value=el.ImageFolderID);fragment.appendChild(el);
dgo
5

Autre approche avec ES6

fetch('https://restcountries.eu/rest/v1/all')
  .then((response) => {
    return response.json()
  })
  .then((countries) => {
    var options = document.getElementById('someSelect');
    countries.forEach((country) => {
      options.appendChild(new Option(country.name, country.name));
    });
  })
Israel Perales
la source
2

J'utilise le plugin selectboxes jquery. Cela transforme votre exemple en:

$('#idofselect').ajaxAddOption('/Admin/GetFolderList/', {}, false);
Brian Yarger
la source
2
$.get(str, function(data){ 
            var sary=data.split('|');
            document.getElementById("select1").options.length = 0;
            document.getElementById("select1").options[0] = new Option('Select a State');
            for(i=0;i<sary.length-1;i++){
                document.getElementById("select1").options[i+1] = new Option(sary[i]);
                document.getElementById("select1").options[i+1].value = sary[i];
            }
            });
sunil
la source
1

J'espère que ça aide. J'utilise généralement des fonctions à la place, j'écris tout le code à chaque fois.

    $("#action_selector").change(function () {

        ajaxObj = $.ajax({
            url: 'YourURL',
            type: 'POST', // You can use GET
            data: 'parameter1=value1',
            dataType: "json",
            context: this,                
            success: function (data) {
                json: data              
            },
            error: function (request) {
                $(".return-json").html("Some error!");
            }
        });

        json_obj = $.parseJSON(ajaxObj.responseText);            

        var options = $("#selector");
        options.empty();
        options.append(new Option("-- Select --", 0));
        $.each(ajx_obj, function () {
            options.append(new Option(this.text, this.value));
        });
    });
});
Pablo Rocha Villagra
la source
1
function generateYears() {
                    $.ajax({
                        type: "GET",
                        url: "getYears.do",
                        data: "",
                        dataType: "json",
                        contentType: "application/json",
                        success: function(msg) {
                            populateYearsToSelectBox(msg);
                        }
                    });
}

function populateYearsToSelectBox(msg) {
  var options = $("#selectYear");
$.each(msg.dataCollecton, function(val, text) {
   options.append(
        $('<option></option>').val(text).html(text)
    );
});
}
Dulith De Costa
la source
1

voici un exemple que j'ai fait sur le changement que je reçois des enfants de la première sélection en deuxième sélection

jQuery(document).ready(function($) {
$('.your_select').change(function() {
    $.ajaxSetup({
        headers:{'X-CSRF-TOKEN': $("meta[name='csrf-token']").attr('content')}
    });

    $.ajax({
        type:'POST',
        url: 'Link',
        data:{
          'id': $(this).val()
        },
        success:function(r){
          $.each(r, function(res) {
                console.log(r[res].Nom);
                 $('.select_to_populate').append($("<option />").val(r[res].id).text(r[res].Nom));
            });
        },error:function(r) {
          alert('Error');
        }
    });
});

});enter code here

Abdelghafour Ennahid
la source
0

J'utilise jQuery et appelle une fonction pour remplir les listes déroulantes.

function loadDropDowns(name,value)
{
   var ddl = "#Categories";
   $(ddl).append('<option value="' + value + '">' + name + "</option>'");
}
Patrick
la source
0
function LoadCategories() {
    var data = [];
    var url = '@Url.Action("GetCategories", "InternalTables")';
    $.getJSON(url, null, function (data) {
        data = $.map(data, function (item, a) {
            return "<option value=" + item.Value + ">" + item.Description + "</option>";
        });
        $("#ddlCategory").html('<option value="0">Select</option>');
        $("#ddlCategory").append(data.join(""));
    });
}
Deenathaiyalan Shanmugam
la source
0

Vous trouverez ci-dessous la manière Jquery de remplir une liste déroulante dont l'ID est "FolderListDropDown"

$.getJSON("/Admin/GetFolderList/", function(result) {
    for (var i = 0; i < result.length; i++) {
        var elem = $("<option></option>");
        elem.attr("value", result[i].ImageFolderID);
        elem.text(result[i].Name);
        elem.appendTo($("select#FolderListDropDown"));
     }
});
Hang Yu
la source