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?

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

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


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 ...


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

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.


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

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.


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

2

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

$('#idofselect').ajaxAddOption('/Admin/GetFolderList/', {}, false);

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

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

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

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


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

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

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"));
     }
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.