jQuery: Açılır pencereyi doldurmak için en iyi uygulama?


269

Her zaman yayınlanan gördüğüm örnek o kadar yetersiz görünüyor, çünkü jQuery gibi görünmüyor dizeleri birleştirme içerir. Genellikle şöyle görünür:

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

Daha iyi bir yol var mı?

Yanıtlar:


448

Andreas Grech oldukça yakındı ... aslında this( thisdöngüdeki öğe yerine referansa dikkat edin ):

var $dropdown = $("#dropdown");
$.each(result, function() {
    $dropdown.append($("<option />").val(this.ImageFolderID).text(this.Name));
});

5
Buradaki antik tarih biliyorum, ama şimdi böyle tökezleyen benim gibi Google çalışanları için, <option/>her birini oluşturmak yerine bir öğeyi klonlasanız daha hızlı olmaz mıydı ?
ot toplama makineleri

2
Ben öyle düşünmüyorum ... her iki durumda da yeni bir öğe başlatacak.
quillbreaker

9
Güzel! Her ne kadar öğe "#dropdown" ya da öylesine isimlendirilirse örnek daha net olabileceğini düşünüyorum, çünkü seçeneklerin gerçek üst öğesini daha iyi yansıtır.
Anders

4
Önce tüm seçenekleri (bir dize değişkeni ile) inşa ve daha sonra bu dize ek seçim denetimine eklemek daha verimli olmalı, çünkü bu sadece bir kez sayfa düzeni neden olacaktır düşünüyorum
Wint

1
Bildirimler alıp hiçbir şey göremiyorsanız özür dileriz. Önceki yorumlarımı sildim. Çünkü kendi yorumlarımı okuduktan sonra cevabı daha iyi anladım :)
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));
    });
});

Yukarıda yaptığım şey, yeni bir <option>öğe oluşturmak ve optionslisteye eklemek (varsayarak)options (bir açılır öğenin kimliği olduğu .

PS Benim javascript biraz paslı yani sözdizimi mükemmel olmayabilir


1
Bu oldukça yakın ve beni doğru yöne getirdi. Cevabımı aşağıda görebilirsiniz.
Jeff Putz

Tatlı! gerçekten yararlı, uzun zamandır
Kyle

41

Tabii - optionsdizeleri bir dizi yapmak ve döngü her zaman .join('')yerine kullanın +=. Çok sayıda seçenekle uğraşırken hafif performans artışı ...

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

Evet. Hâlâ dizelerle çalışıyorum. İster inanın ister inanmayın, DOM parçası oluşturmanın en hızlı yolu ... Şimdi, sadece birkaç seçeneğiniz varsa, gerçekten önemli değil - stili beğenirseniz Dreas'in gösterdiği tekniği kullanın . Ancak unutmayın, tarayıcının dahili HTML ayrıştırıcısını çağırıyorsunuzi*2 zamanlarını yalnızca bir kez değil, DOM'u döngü boyunca her seferinde değiştirdiğinizi unutmayın ... yeterli sayıda seçenekle. bunun için ödeme yaparsınız, özellikle de eski tarayıcılarda.

Not: As Adalet bu apart eğer düşecek, işaret ImageFolderIDve Nameolmayan düzgün kodlanmış ...


1
Sen kodlamak gerekir result[i].ImageFolderIDve result[i].Namesırasıyla html-nitelik değeri ve html-metin olarak. Sunucunun json değil, piç döndürdüğünü varsayacağından, önceden kodlanmış sunucudan geldiklerini varsaymazdım.
yfeldblum

@ Adalet: haklısın, ama Jeff'in örneği atladığı için ben de yaptım. Olsa bir not ekleyeceğiz, teşekkürler.
Şok9

1
@Ricibald'ın verdiği cevaba oy verdim çünkü garip bir şekilde, karşılaştığım bu teste dayanarak, birleştirme joinhemen hemen her tarayıcıdan daha hızlı çıkıyor .
savak

24

Ya da belki:

var options = $("#options");
$.each(data, function() {
    options.append(new Option(this.text, this.value));
});

6
var myOptions = {val1: 'metin1', val2: 'metin2'}; $ .each (myOptions, function (val, text) {$ ('# mySelect'). append (yeni Seçenek (metin, val));});
Demz

19

En hızlı yol şudur:

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

Bu bağlantıya göre en hızlı yol, çünkü herhangi bir DOM ekleme yaparken her şeyi tek bir öğeye sarıyorsunuz.


Ancak replaceWith ile size dom seçmiş zaten ben etkinlikleri korumak istiyorsanız options.html (optionsValue) ile daha iyi olacağını düşünüyorum belirtmek için ekli olayları kaybetmek yerine
Geomorillo

12

Bunu jquery sitesinden buldum

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

5

DOM öğesinin her yerleştirilmesinde sayfa yeniden akışını önlediğinden, belge parçalarını kullanmanın performans gösterdiğini okudum, ayrıca tüm tarayıcılar (hatta IE 6) tarafından da destekleniyor.

var fragment = document.createDocumentFragment();

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

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

Bunu ilk olarak CodeSchool'un JavaScript En İyi Uygulamaları kursunda okudum .

İşte farklı yaklaşımların bir karşılaştırması , teşekkürler yazara gidin.


Bu kesinlikle hızlı bir yol. Daha da iyisi - jQuery ile birlikte hepsini atlayın:result.forEach(function(el){var option=document.createElement('option').option.textContent=el.name;option.value=el.ImageFolderID);fragment.appendChild(el);
dgo

5

ES6 ile diğer yaklaşımlar

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

Kullandığım selectboxes jquery eklentisi. Örneğinizi şu şekilde dönüştürür:

$('#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

Umut ediyorum bu yardım eder. Ben genellikle her kodu yerine tüm kodu yazmak işlevlerini kullanın.

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

İşte ben değişti yaptım bir örnek ikinci seçimde ilk seçim çocuk almak

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

JQuery kullanarak ve açılan çıkışları doldurmak için bir işlevi çağırıyor.

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

Aşağıda kimliği "FolderListDropDown" olan bir açılır listeyi doldurmanın Jquery yolu

$.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"));
     }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.