jQuery: meilleure pratique pour peupler drop down?

L'exemple que je vois posté tout le temps semble comme il est sous-optimal, parce qu'il implique des cordes concaténantes, qui semble si pas jQuery. Il ressemble habituellement à 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 un meilleur moyen?

243
demandé sur Jeff Putz 2009-05-02 20:10:55

15 réponses

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

var $dropdown = $("#dropdown");
$.each(result, function() {
    $dropdown.append($("<option />").val(this.ImageFolderID).text(this.Name));
});
397
répondu Jeff Putz 2017-12-02 19:40:14
$.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, c'est créer un nouvel élément <option> et l'ajouter à la liste options (en supposant que options est L'ID d'un élément descendant.

PS Mon javascript est un peu rouillé, donc la syntaxe ne peut pas être parfait

63
répondu Andreas Grech 2009-05-03 02:34:16

Assurez-vous - faire options un tableau de chaînes de caractères et utiliser .join('') plutôt que += à chaque passage dans la boucle. Légère bosse de performance lors de l'utilisation 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 avec des ficelles tout le temps. Croyez-le ou non, c'est la façon la plus rapide de construire un fragment de DOM... Maintenant, si vous n'avez que quelques options, cela n'aura pas vraiment d'importance - utilisez la technique dreas demonstrates si vous aimez le style. Mais gardez à l'esprit, vous invoquez L'analyseur HTML interne du navigateur i*2 fois, plutôt qu'une seule fois, et de modifier le DOM à chaque fois à travers la boucle... avec un nombre suffisant d'options. vous finirez par payer pour cela, surtout sur les anciens navigateurs.

Note: comme le souligne Justice, cela tombera en morceaux si ImageFolderID et Name ne sont pas codé correctement ...

37
répondu Shog9 2017-05-23 12:02:59

ou peut-être:

var options = $("#options");
$.each(data, function() {
    options.append(new Option(this.text, this.value));
});
21
répondu xinthink 2016-07-01 06:14:50

la voie la plus rapide est celle-ci:

 $.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 est le moyen le plus rapide parce que vous envelopper tout dans un seul élément lors de faire toute sorte d'insertion DOM.

15
répondu Ricibald 2009-07-01 08:50:23

j'ai trouvé que cela fonctionne à partir du site de jquery

$.getJSON( "/Admin/GetFolderList/", function( data ) {
  var options = $("#dropdownID");
  $.each( data, function(key, val) {
    options.append(new Option(key, val));
  });
});
10
répondu binshi 2016-03-16 09:00:04

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));
    });
  })
3
répondu Israel Perales 2017-09-14 15:02:09

j'utilise le selectbox jQuery plugin. Il transforme votre exemple en:

$('#idofselect').ajaxAddOption('/Admin/GetFolderList/', {}, false);
2
répondu Brian Yarger 2009-05-02 16:17:51
$.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];
            }
            });
2
répondu sunil 2012-03-15 17:47:18

j'ai lu que l'utilisation de document fragments est performant parce qu'il évite le retour de page sur chaque insertion D'élément DOM, il est également bien pris 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 lu à ce sujet pour la première fois dans le cours Codeschool's JavaScript Best Practices .

Voici une comparaison de différentes approches , grâce à auteur.

2
répondu Dapeng Li 2016-03-04 09:32:58
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
répondu Dulith De Cozta 2017-08-28 04:55:36

j'espère que ça aidera. J'utilise habituellement des fonctions à la place d'écrire 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));
        });
    });
});
0
répondu Pablo Rocha Villagra 2016-02-04 17:05:37

j'ai utilisé jQuery et j'ai appelé une fonction pour remplir les gouttières.

function loadDropDowns(name,value)
{
   var ddl = "#Categories";
   $(ddl).append('<option value="' + value + '">' + name + "</option>'");
}
0
répondu Patrick 2016-09-05 21:44:28
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
répondu Deenathaiyalan Shanmugam 2017-05-03 16:08:47

voici un exemple que j'ai fait sur le changement j'obtiens les enfants du premier sélectionner dans le deuxième sélectionner

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
répondu Abdelghafour Ennahid 2017-12-11 12:21:10