jQuery: Best Practice zum Auffüllen von Dropdowns?

267

Das Beispiel, das ich ständig gepostet sehe, scheint nicht optimal zu sein, da es das Verketten von Zeichenfolgen beinhaltet, was also nicht jQuery zu sein scheint. Es sieht normalerweise so aus:

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

Gibt es einen besseren Weg?

Jeff Putz
quelle

Antworten:

446

Andreas Grech war ziemlich nah dran ... es ist tatsächlich so this(beachten Sie den Verweis auf thisanstelle des Elements in der Schleife):

var $dropdown = $("#dropdown");
$.each(result, function() {
    $dropdown.append($("<option />").val(this.ImageFolderID).text(this.Name));
});
Jeff Putz
quelle
5
Die alte Geschichte hier weiß ich, aber für Googler wie mich, die gerade darüber gestolpert sind, wäre es nicht noch schneller, wenn Sie ein <option/>Element klonen würden , anstatt jedes zu erstellen?
Tedders
2
Ich glaube nicht ... so oder so wird es einen neuen Gegenstand instanziieren.
Federbrecher
9
Nett! Obwohl ich denke, dass das Beispiel klarer sein könnte, wenn das Element "#dropdown" oder so heißt, da es das tatsächliche übergeordnete Element der Optionen besser widerspiegelt.
Anders
4
Ich denke, dass es effizienter sein sollte, zuerst alle Optionen im Speicher (mit einer Zeichenfolgenvariablen) zu erstellen und diese Zeichenfolge dann an das übergeordnete Auswahlsteuerelement anzuhängen, da dies nur einmal zu einem Seitenlayout führt
Wint
1
Entschuldigung, wenn Sie Benachrichtigungen erhalten und nichts sehen. Ich habe meine vorherigen Kommentare gelöscht. Weil ich die Antwort besser verstanden habe, nachdem ich meine eigenen Kommentare
gelesen hatte
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));
    });
});

Was ich oben mache, ist ein neues <option>Element zu erstellen und es der optionsListe hinzuzufügen (vorausgesetzt, es optionsist die ID eines Dropdown-Elements.

PS Mein Javascript ist etwas verrostet, daher ist die Syntax möglicherweise nicht perfekt

Andreas Grech
quelle
1
Das ist ziemlich nah und hat mich in die richtige Richtung gebracht. Siehe meine Antwort unten.
Jeff Putz
Süss! Sehr hilfreich, ich habe meine Dropdowns schon lange bevölkert und es sah immer nicht professionell aus
Kyle
41

Sicher - machen Sie optionseine Reihe von Zeichenfolgen und verwenden Sie .join('')sie nicht +=jedes Mal durch die Schleife. Leichte Leistungseinbußen beim Umgang mit einer Vielzahl von Optionen ...

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

Ja. Ich arbeite immer noch die ganze Zeit mit Streichern. Ob Sie es glauben oder nicht, das ist der schnellste Weg, um ein DOM-Fragment zu erstellen ... Wenn Sie nur wenige Optionen haben, spielt es keine Rolle - verwenden Sie die Technik, die Dreas demonstriert, wenn Sie den Stil mögen. Beachten Sie jedoch, dass Sie die internen HTML-Parserzeiten des Browsers i*2nicht nur einmal aufrufen und das DOM jedes Mal durch die Schleife ändern ... mit einer ausreichenden Anzahl von Optionen. Sie werden am Ende dafür bezahlen, besonders bei älteren Browsern.

Hinweis: Wie Richter weist darauf hin, diese auseinander fallen , wenn ImageFolderIDund Namesind nicht richtig codiert ...

Shog9
quelle
1
Sie sollten result[i].ImageFolderIDund result[i].Nameals HTML-Attributwert bzw. HTML-Text codieren . Ich würde nicht annehmen, dass sie vom vorcodierten Server stammen, da ich annehmen würde, dass der Server json zurückgibt, nicht bastardisiertes json.
Yfeldblum
@Justice: Du hast Recht, aber da Jeffs Beispiel es weggelassen hat, habe ich es auch getan. Ich werde jedoch eine Notiz hinzufügen, danke.
Shog9
1
Ich habe für die Antwort gestimmt, die @Ricibald gegeben hat, weil sich aufgrund dieses Tests seltsamerweise herausstellt, dass die Verkettung schneller ist als joinin praktisch jedem Browser.
Wehr
24

Oder vielleicht:

var options = $("#options");
$.each(data, function() {
    options.append(new Option(this.text, this.value));
});
xinthink
quelle
6
var myOptions = {val1: 'text1', val2: 'text2'}; $ .each (myOptions, function (val, text) {$ ('# mySelect'). append (neue Option (text, val));});
Der Demz
19

Der schnellste Weg ist folgender:

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

Laut diesem Link ist dies der schnellste Weg, da Sie bei jeder Art von DOM-Einfügung alles in ein einziges Element einschließen.

Ricibald
quelle
jedoch mit replaceWith ersetzen Sie die Auswahl in dom und verlieren die Ereignisse, die bereits mit der Auswahl verbunden sind. Ich denke, es wäre besser mit options.html (optionsValue), wenn Sie Ereignisse
beibehalten
12

Ich fand, dass dies von jquery site funktioniert

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

Ich habe gelesen, dass die Verwendung von Dokumentfragmenten performant ist, da sie den Seitenrückfluss bei jedem Einfügen eines DOM-Elements vermeidet und auch von allen Browsern (sogar IE 6) gut unterstützt wird.

var fragment = document.createDocumentFragment();

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

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

Ich habe dies zum ersten Mal im JavaScript Best Practices-Kurs von CodeSchool gelesen .

Hier ist ein Vergleich verschiedener Ansätze , danke an den Autor.

Dapeng Li
quelle
Dies ist definitiv der schnelle Weg. Noch besser - überspringen Sie jQuery mit all dem zusammen:result.forEach(function(el){var option=document.createElement('option').option.textContent=el.name;option.value=el.ImageFolderID);fragment.appendChild(el);
dgo
5

Anderer Ansatz mit 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
quelle
2

Ich benutze das Selectboxes JQuery Plugin. Es macht Ihr Beispiel zu:

$('#idofselect').ajaxAddOption('/Admin/GetFolderList/', {}, false);
Brian Yarger
quelle
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
quelle
1

Ich hoffe, es hilft. Normalerweise benutze ich Funktionen, anstatt jedes Mal den gesamten Code zu schreiben.

    $("#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
quelle
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
quelle
1

Hier ist ein Beispiel, das ich bei einer Änderung gemacht habe. Ich bekomme Kinder der ersten Auswahl in der zweiten Auswahl

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
quelle
0

Ich habe jQuery verwendet und eine Funktion aufgerufen, um Dropdowns zu füllen.

function loadDropDowns(name,value)
{
   var ddl = "#Categories";
   $(ddl).append('<option value="' + value + '">' + name + "</option>'");
}
Patrick
quelle
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
quelle
0

Unten finden Sie die Jquery-Methode zum Auffüllen einer Dropdown-Liste mit der ID "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
quelle