jQuery:ドロップダウンを設定するためのベストプラクティス?


269

私がいつも投稿している例は、jQueryではないように見える文字列の連結が含まれているため、最適とは言えないようです。通常は次のようになります。

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

もっと良い方法はありますか?

回答:


448

Andreas Grechはかなり近かった...それは実際にあるthisthisループ内の項目の代わりにへの参照に注意してください):

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

5
ここでは古代の歴史を知っていますが、今これに遭遇したばかりの私のようなグーグルにとって、<option/>それぞれを作成する代わりに要素を複製した方が速くはないでしょうか?
テッダー、2013年

2
私はそうは思いません...いずれにしても、それは新しいアイテムをインスタンス化するでしょう。
キルブレーカー2014年

9
いいね!要素に「#dropdown」などの名前が付けられている場合は、オプションの実際の親要素をより適切に反映するため、例はより明確になると思います。
アンデルス

4
最初にメモリ内のすべてのオプションを(文字列変数を使用して)構築し、次にこの文字列を親の選択コントロールに追加すると、ページレイアウトが1回だけ発生するため、より効率的である
Wint

1
通知を受けても何も表示されない場合は、申し訳ありません。以前のコメントを削除しました。私自身のコメントを読んだ後、私は答えをより理解したので:)
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));
    });
});

上記で私がしていることは、新しい<option>要素を作成してoptionsリストに追加することです(optionsドロップダウン要素のIDであると想定しています)。

PS私のJavaScriptは少し錆びているので、構文が完全ではない可能性があります


1
それはかなり近いです、そして私を正しい方向に導きました。以下の私の答えを参照してください。
ジェフプツ

甘い!本当に役に立ちました。私は長い間ドロップダウンにデータを入力してきましたが、常にプロのようには見えませんでした
Kyle

41

確かに- options文字列の配列を作成し、ループ.join('')全体で+=毎回ではなく使用します。多数のオプションを扱うときのパフォーマンスのわずかなバンプ...

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

はい。私はまだずっと弦を使っています。信じられないかもしれませんが、これがDOMフラグメントを構築する最速の方法です...いくつかのオプションしかない場合は、それほど重要ではありません。Dreasがスタイルを気に入っているかどうかを示すテクニックを使用してください。ただし、ブラウザーの内部HTMLパーサーを1 i*2回だけではなく何度も呼び出し、ループのたびにDOMを変更していることを覚えておいてください...十分な数のオプションを使用します。特に古いブラウザでは、最終的に料金を支払うことになります。

注: Justiceが指摘しているようにImageFolderID適切にエンコードされNameていないと、これはばらばらになります ...


1
html-attribute-valueとhtml-textとしてそれぞれエンコードresult[i].ImageFolderIDresult[i].Nameてください。私はサーバーが粗悪化されたjsonではなくjsonを返すと想定しているため、これらは事前にエンコードされたサーバーからのものであるとは想定していません。
yfeldblum 2009年

@正義:あなたは正しい、しかしジェフの例がそれを省略したので、私もそうしました。ただし、メモを追加します。ありがとうございます。
Shog9 2009年

1
奇妙なことに、私が遭遇したこのテストに基づいて、奇妙なことに、連結はjoin事実上すべてのブラウザーよりも高速であることが判明したため、私は@Ricibaldの回答に投票しました。

24

または多分:

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

6
var myOptions = {val1: 'text1'、val2: 'text2'}; $ .each(myOptions、function(val、text){$( '#mySelect')。append(new Option(text、val));});
Demz 2013

19

最速の方法はこれです:

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

このリンクによるとあらゆる種類のDOM挿入を実行するときにすべてを単一の要素にラップするため、最も高速な方法です。


ただし、replaceWithを使用すると、selectをdomで置き換えると、selectに既にアタッチされているイベントが失われます。イベントを保持したい場合は、options.html(optionsValue)を使用した方がよいと思います
Geomorillo

12

これはjqueryサイトから機能していることがわかりました

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

5

DOM要素を挿入するたびにページのリフローを回避できるため、ドキュメントフラグメントを使用するとパフォーマンスが向上することを確認しました。また、すべてのブラウザー(IE 6も含む)で十分にサポートされています。

var fragment = document.createDocumentFragment();

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

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

これについては、まずCodeSchoolのJavaScriptベストプラクティスコースで読みました。

さまざまなアプローチの比較を以下に示します。著者に感謝します。


これは間違いなくスピーディーな方法です。さらに良い-jQueryをこれと一緒にスキップする:result.forEach(function(el){var option=document.createElement('option').option.textContent=el.name;option.value=el.ImageFolderID);fragment.appendChild(el);
dgo

5

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

お役に立てば幸いです。通常、代わりに関数を使用して、すべてのコードを毎回書き込みます。

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

これは私が変更時に行った例で、最初の選択の子を2番目の選択で取得します

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を使用して、ドロップダウンに値を入力する関数を呼び出しています。

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

以下は、IDが「FolderListDropDown」であるドロップダウンリストを生成するJqueryの方法です。

$.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"));
     }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.