jQuery를 사용하여 JavaScript 객체로 선택 항목에 옵션을 추가하는 가장 좋은 방법은 무엇입니까?


1379

<select>jQuery를 사용하여 JavaScript 객체에서 옵션을 추가하는 가장 좋은 방법은 무엇입니까 ?

플러그인이 필요없는 것을 찾고 있지만 거기에있는 플러그인에도 관심이 있습니다.

이것이 내가 한 일입니다.

selectValues = { "1": "test 1", "2": "test 2" };

for (key in selectValues) {
  if (typeof (selectValues[key] == 'string') {
    $('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>');
  }
}

깨끗하고 간단한 솔루션 :

이것은 matdumsa의 정리되고 단순화 된 버전입니다 .

$.each(selectValues, function(key, value) {
     $('#mySelect')
          .append($('<option>', { value : key })
          .text(value));
});

matdumsa의 변경 사항 : (1) append () 안의 옵션에 대한 닫기 태그를 제거하고 (2) 속성 / 속성을 append ()의 두 번째 매개 변수로 맵으로 옮겼습니다.


4
아마 도움이 될 것입니다 : texotela.co.uk/code/jquery/select (이 질문에 걸려 넘어지면 저에게 도움이되었습니다)
ManBugra

2
위에 나열된 정리 버전은 Jquery 1.4 이상에서만 작동합니다. 이전 버전 matdumsa의 대답의 하나를 사용을 위해
Thedric 워커

matdumsa의 답변에서 볼 수 있듯이 {value : key}는 { "value": key} 여야합니다.
Nick P

value문자열 (및 하드 코딩 된)이므로 인용 할 필요가 없기 때문에 믿지 않습니다.
Darryl Hein

1
제목은 대신 "JQuery를 사용하여 JSON 객체에서 선택 항목에 옵션을 추가하는 가장 좋은 방법은 무엇입니까?"
Dr Fred

답변:


1383

jQuery 방식으로 다른 답변과 동일합니다.

$.each(selectValues, function(key, value) {   
     $('#mySelect')
         .append($("<option></option>")
                    .attr("value", key)
                    .text(value)); 
});

99
먼저 $("#mySelect")var에 할당 합니다. 그렇지 않으면 $("#mySelect")루프를 업데이트 할 때마다 DOM을 업데이트하는 것처럼 매우 낭비됩니다. artzstudio.com/2009/04/jquery-performance-rules/
Patrick

7
글쎄, 당신은 var mySelect = $("#mySelect") outside of the 각 루프를 할 수 있습니다 . 훨씬 더 효율적입니다. 아래 칼의 답변을보십시오
Patrick

17
더 나은 jQuery 스타일에 대한 나의 추천 : $ ( '# mySelect') .append ($ ( "<option />") .val (key) .text (value));
FAjir

10
이 답변의 인기로 루프에서 DOM 업데이트를 피해야한다고 언급 할 가치가 있습니다. jsperf.com/jquery-append-array-vs-string
jthomas

6
이 답변은 잘못된 의도 때문에 너무 오도되었습니다 ... attr그리고 text실제로는 $('<option/>')-object의 방법입니다
phil294

268
var output = [];

$.each(selectValues, function(key, value)
{
  output.push('<option value="'+ key +'">'+ value +'</option>');
});

$('#mySelect').html(output.join(''));

이런 식으로 한 번만 "DOM을 터치"하십시오.

jQuery 내부를 모르기 때문에 최신 줄을 $ ( '# mySelect'). html (output.join ( ''))로 변환 할 수 있는지 확실하지 않습니다 (html ()에서 일부 구문 분석을 수행 할 수 있음) 방법)


20
jQuery를 덜 사용하기 때문에 위의 '올바른'답보다 빠른 방법입니다.
Teej

4
"$ ( '# mySelect'). get (0) .innerHTML = output.join ( '');"줄 Chrome 및 FF3.x에서 작동하지만 IE7에서는 작동하지 않습니다.
blu

19
key따옴표가 있거나 >, <안에 있으면 중단됩니다 .
nickf

3
그리고 내가 잃고 싶지 않은 두 가지 옵션이 있다면. 이 새로운 옵션 값을 기존 값에 어떻게 추가 할 수 있습니까?
VansFannel

6
한 가지 작은 개선점은 다음과 같이 더하기 부호 대신 결합을 사용하여 연결하는 것입니다. output.push ( '<option value = "', key, '">', value, '</ option>');
MM.

202

이것은 조금 더 빠르고 깨끗합니다.

var selectValues = {
  "1": "test 1",
  "2": "test 2"
};
var $mySelect = $('#mySelect');
//
$.each(selectValues, function(key, value) {
  var $option = $("<option/>", {
    value: key,
    text: value
  });
  $mySelect.append($option);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="mySelect"></select>


3
완전한. 추가하기 위해 선택에 대한 추가 속성을 추가 할 수 있습니다. $ .each (selectValues, function (id, value, text) {$ ( '# mySelect'). append ($ ( "<option />", {id : id 값 : value, text : text}));} );
idok

45
`$ ( '# mySelect')`를 캐시하여 루프 전에 한 번만 찾아 보는 것이 좋습니다. 현재 모든 단일 옵션에 대한 요소를 DOM에서 검색하고 있습니다.
Sushanth-

@Sushanth-세트가 작 으면 성능이 얼마나 큰가요?
ckarbass 2009 년

3
@ckarbass-DOM의 크기에 따라 다릅니다. 변수를 변수에 할당하려는 잠재적으로 크고 작은 노력은 SO에 주석을 쓰는 것보다 훨씬 적습니다!
Nick H247

97

jQuery

var list = $("#selectList");
$.each(items, function(index, item) {
  list.append(new Option(item.text, item.value));
});

바닐라 자바 ​​스크립트

var list = document.getElementById("selectList");
for(var i in items) {
  list.add(new Option(items[i].text, items[i].value));
}

4
Option전에 물건에 대해 들어 본 적이 없습니다 . 모든 브라우저에 내장되어 있습니까?
Darryl Hein 2016 년

2
나는을 사용하려고 시도했지만 new OptionIE6 & 7에서 작동하지 않는다는 것을 알았습니다. 이유는 없지만 많은 전체 jQuery 옵션이 작동했습니다.
Darryl Hein

선택을 추가하는 좋은 방법. new Option('display', value, true)
보트 코더 September

@ Mark0978 실제로는 new Option('display', value, true, true)( javascriptkit.com/jsref/select.shtml )
Carl Hörberg

38

이전 IE 버전을 지원할 필요가없는 경우 Option생성자를 사용하는 것이 명확하고 읽기 쉬운 방법입니다 .

$(new Option('myText', 'val')).appendTo('#mySelect');

기능과 동일하지만 다음보다 깨끗합니다.

$("<option></option>").attr("value", "val").text("myText")).appendTo('#mySelect');

31

이것은 더보기 좋고 가독성을 제공하지만 다른 방법보다 느립니다.

$.each(selectData, function(i, option)
{
    $("<option/>").val(option.id).text(option.title).appendTo("#selectBox");
});

속도를 원한다면 문자열 연결이 아닌 배열을 사용하고 하나의 추가 호출 만 사용하는 가장 빠른 방법입니다.

auxArr = [];
$.each(selectData, function(i, option)
{
    auxArr[i] = "<option value='" + option.id + "'>" + option.title + "</option>";
});

$('#selectBox').append(auxArr.join(''));

이것이 "가장 빠른"방법은 배열에 삽입하기 전에 모든 옵션의 구성 옵션을 연결하는 대신 다양한 문자열 부분을 개별 배열 항목으로 삽입한다는 것을 의미하지 않습니까?
bitoolean

22

더 오래된 @joshperry의 답변 개선 :

일반 .append 도 예상대로 작동 하는 것 같습니다 .

$("#mySelect").append(
  $.map(selectValues, function(v,k){

    return $("<option>").val(k).text(v);
  })
);

더 짧거나

$("#mySelect").append(
  $.map(selectValues, (v,k) => $("<option>").val(k).text(v))
  // $.map(selectValues, (v,k) => new Option(v, k)) // using plain JS
);

당신은 선택적으로 사용할 수 $.weakmap있도록GC
Chef_Code

2
우아함의 보너스 포인트 : 객체 배열을 올바르게 추가하는 map()속성과 결합 된 구문을 적절하게 사용하십시오 append()!
Jochem Schulenklopper

@ joshperry 나는 기술적 수정 / 업데이트를 기대하면서 실망했습니다.
Сухой27

20

이 모든 대답은 불필요하게 복잡해 보입니다. 필요한 것은 다음과 같습니다.

var options = $('#mySelect').get(0).options;
$.each(selectValues, function(key, value) {
        options[options.length] = new Option(value, key);
});

그것은 완전히 크로스 브라우저와 호환됩니다.


그럴까요 new Option(value, key);? 매개 변수의 순서는 옵션 (text_visible_part, value_behind_the_scenes)입니다.
Bob Stein

어레이 푸시 브라우저와 호환되지 않습니까? 그렇다면 Array push를 더 읽기 쉽도록 불필요하게 복잡하지 않습니까?
bitoolean

18

경고 ... Android 2.2 (Cyanogen 7.0.1) 전화 (T-Mobile G2)에서 PhoneGap 1.0.0과 함께 jQuery Mobile 1.0b2를 사용하고 있으며 .append () 메서드를 전혀 사용할 수 없습니다. 다음과 같이 .html ()을 사용해야했습니다.

var options;
$.each(data, function(index, object) {
    options += '<option value="' + object.id + '">' + object.stop + '</option>';
});

$('#selectMenu').html(options);

18
 var output = [];
 var length = data.length;
 for(var i = 0; i < length; i++)
 {
    output[i++] = '<option value="' + data[i].start + '">' + data[i].start + '</option>';
 }

 $('#choose_schedule').get(0).innerHTML = output.join('');

나는 몇 가지 테스트를 수행했으며 이것이 가장 빠른 작업을 수행한다고 생각합니다. :피


1
. 각각 같은 결과를 달성하는 다른 방법에 비해 악명이 느립니다. 이것이 내가 생각한 것이므로이 접근법을 권장합니다.
Allen Tellez

불행히도 여기서 변형의 90 %가 $ .each ()를 사용합니다. for () 루프는 크기가 작더라도 훨씬 더 많은 제어 및 성능 이점을 제공 할 수 있습니다.
HoldOffHunger

15

Microsoft Templating 방식을 사용하는 방식이 있습니다현재 jQuery 코어에 포함시키기 위해 제안 된 을 . 템플릿을 사용하는 데 더 많은 권한이 있으므로 가장 간단한 시나리오에서는 최상의 옵션이 아닐 수 있습니다. 자세한 내용은 기능에 대한 Scott Gu의 게시물을 참조하십시오.

먼저 github 에서 사용 가능한 템플릿 js 파일을 포함하십시오 .

<script src="Scripts/jquery.tmpl.js" type="text/javascript" />

다음 템플릿 설정

<script id="templateOptionItem" type="text/html">
    <option value=\'{{= Value}}\'>{{= Text}}</option>
</script>

그런 다음 데이터를 사용하여 .render () 메서드를 호출하십시오.

var someData = [
    { Text: "one", Value: "1" },
    { Text: "two", Value: "2" },
    { Text: "three", Value: "3"}];

$("#templateOptionItem").render(someData).appendTo("#mySelect");

나는 한 블로그에 자세히이 방법을.


12

Ajax를 통해 드롭 다운 항목을로드하여 이와 같은 것을 만들었습니다 . 위의 응답도 수용 가능하지만 성능을 향상시키기 위해 가능한 한 적은 DOM 수정을하는 것이 좋습니다.

따라서 루프 안에 각 항목을 추가하는 대신 루프 내에서 항목을 수집하고 완료되면 추가하는 것이 좋습니다.

$(data).each(function(){
    ... Collect items
})

덧붙여

$('#select_id').append(items); 

또는 더 나은

$('#select_id').html(items);

$ ( '# select_id'). html (items); append를 사용하면 모든 onchange 이벤트에서 항목을 계속 추가합니다. 정말 고맙습니다.
Dipanwita Das

10

간단한 방법은 다음과 같습니다.

$('#SelectId').html("<option value='0'>select</option><option value='1'>Laguna</option>");

이미 옵션 목록을 작성 했으므로 Willard가 말한 것처럼 선택 필드를 채우는 것이 쉽습니다.
Loony2nz

10

다른 답변의 대부분은 each함수를 사용하여selectValues . 이를 위해서는 각 요소에 대해 추가를 호출해야하며 각 요소를 개별적으로 추가 할 때 리플 로우가 트리거됩니다.

map 과 element 생성자를 사용하여 생성 된 요소 append배열을 option사용하여 한 번만 호출하도록 더 현대적인 기능적 방법 (현대 JS 사용)으로이 답변을 업데이트 할 수 있습니다 .Option

OptionDOM 요소를 사용하면 option생성 후 요소를 업데이트 할 필요가없고 jQuery의 구문 분석 논리를 실행할 필요가 없으므로 함수 호출 오버 헤드를 줄여야 합니다.

$('mySelect').append($.map(selectValues, (k, v) => new Option(k, v)))

옵션 객체를 새로 만드는 팩토리 유틸리티 기능을 만들면 더 간단해질 수 있습니다.

const newoption = (...args) => new Option(...args)

그런 다음에 직접 제공 할 수 있습니다 map.

$('mySelect').append($.map(selectValues, newoption))

이전 제형

때문에 append또한 가변 인자로 값을 전달 할 수 있습니다, 우리의 목록을 미리 만들고 수있는 option요소가 매핑 및 사용하여 단일 호출에 인수로를 추가 apply.

$.fn.append.apply($('mySelect'), $.map(selectValues, (k, v) => $("<option/>").val(k).text(v)));

이후 버전의 jQuery append에서도 배열 인수를 허용하며 다소 단순화 할 수 있습니다.

$('mySelect').append($.map(selectValues, (k, v) => $("<option/>").val(k).text(v)))

10
function populateDropdown(select, data) {   
    select.html('');   
    $.each(data, function(id, option) {   
        select.append($('<option></option>').val(option.value).html(option.name));   
    });          
}   

jQuery 1.4.1과 잘 작동합니다.

ASP.NET MVC 및 jQuery와 함께 동적 목록을 사용하는 방법에 대한 전체 기사를 보려면 다음을 방문하십시오.

MVC 및 jQuery가 포함 된 동적 선택 목록


8

Chrome 에서이 솔루션에 정렬 문제가 있습니다 (jQuery 1.7.1) (Chrome은 객체 속성을 이름 / 번호로 정렬합니까?)

optionValues0 = {"4321": "option 1", "1234": "option 2"};

이에

optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}};

그리고 $ .each는 다음과 같습니다.

$.each(optionValues0, function(order, object) {
  key = object.id;
  value = object.value;
  $('#mySelect').append($('<option>', { value : key }).text(value));
}); 

8

모든 곳에서 동일한 코드를 반복하기보다는 다음과 같은 고유 한 jQuery 함수를 작성하는 것이 더 바람직합니다.

jQuery.fn.addOption = function (key, value) {
    $(this).append($('<option>', { value: key }).text(value));
};

그런 다음 옵션을 추가하려면 다음을 수행하십시오.

$('select').addOption('0', 'None');

좀 더 자세히 설명해 주시겠습니까?
Mo.

7

다음 코드를 사용하여 json 배열을 반복 할 수 있습니다

$('<option/>').attr("value","someValue").text("Option1").appendTo("#my-select-id");


7

이전 답변은 모두 유효한 답변이지만 먼저이 모든 것을 documentFragmnet에 추가 한 다음 해당 문서 조각을 요소로 추가하는 것이 좋습니다 ...

이 문제에 대한 John Resig의 생각을 보십시오 ...

다음과 같은 내용이 있습니다.

var frag = document.createDocumentFragment();

for(item in data.Events)
{
    var option = document.createElement("option");

    option.setAttribute("value", data.Events[item].Key);
    option.innerText = data.Events[item].Value;

    frag.appendChild(option);
}
eventDrop.empty();
eventDrop.append(frag);

7
  1. $.eachfor루프 보다 느리다
  2. 매번 DOM 선택은 루프에서 모범 사례가 아닙니다. $("#mySelect").append();

가장 좋은 해결책은 다음과 같습니다.

JSON 데이터 resp

[
    {"id":"0001", "name":"Mr. P"},
    {"id":"0003", "name":"Mr. Q"},
    {"id":"0054", "name":"Mr. R"},
    {"id":"0061", "name":"Mr. S"}
]

로 사용

var option = "";
for (i=0; i<resp.length; i++) {
    option += "<option value='" + resp[i].id + "'>" + resp[i].name + "</option>";
}
$('#mySelect').html(option);

6

또 다른 방법 :

var options = [];    
$.each(selectValues, function(key, value) {
    options.push($("<option/>", {
        value: key,
        text: value
    }));
});
$('#mySelect').append(options);

나는 당신이 여기서 한 일을 보았습니다 ... 당신은 조언을 받아 $('#mySelect')@rocktheroad 답변을 리팩토링했습니다 ... 뭐든지, 이것은 더 실용적인 해결책입니다
Chef_Code

6
if (data.length != 0) {
    var opts = "";
    for (i in data)
        opts += "<option value='"+data[i][value]+"'>"+data[i][text]+"</option>";

    $("#myselect").empty().append(opts);
}

이것은 거대한 문자열을 처음 만든 후에 한 번만 DOM을 조작합니다.


다음으로 대체 $("#myselect").empty().append(opts);하여 이를 더욱 최적화하고 jQuery를 사용하지 getElementById('myselect').innerHtml = opts;
않아도

6

그것이 2 차원 배열로 한 것입니다. 첫 번째 열은 항목 i입니다.에 추가 innerHTML하십시오 <option>. 두 번째 열은 record_id i value입니다 <option>.

  1. PHP

    $items = $dal->get_new_items(); // Gets data from the database
    $items_arr = array();
    $i = 0;
    foreach ($items as $item)
    {
        $first_name = $item->first_name;
        $last_name = $item->last_name;
        $date = $item->date;
        $show = $first_name . " " . $last_name . ", " . $date;
        $request_id = $request->request_id;
        $items_arr[0][$i] = $show;
        $items_arr[1][$i] = $request_id;
        $i++;
    }
    
    echo json_encode($items_arr);
  2. 자바 스크립트 / 아약스

            function ddl_items() {
                if (window.XMLHttpRequest) {
                    // Code for Internet Explorer 7+, Firefox, Chrome, Opera, and Safari
                    xmlhttp=new XMLHttpRequest();
                }
                else{
                    // Code for Internet Explorer 6 and Internet Explorer 5
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
    
                xmlhttp.onreadystatechange=function() {
                if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                    var arr = JSON.parse(xmlhttp.responseText);
                    var lstbx = document.getElementById('my_listbox');
    
                    for (var i=0; i<arr.length; i++) {
                        var option = new Option(arr[0][i], arr[1][i]);
                        lstbx.options.add(option);
                    }
                }
            };
    
            xmlhttp.open("GET", "Code/get_items.php?dummy_time=" + new Date().getTime() + "", true);
            xmlhttp.send();
        }
    }

좋아 보인다 jQuery를 사용하지 않는 것이 너무 나쁩니다. 또한 select.options.add () 메소드와 관련하여 이전에 문제가있었습니다. 어떤 브라우저와 정확한 문제를 기억할 수는 없지만 브라우저에서 벗어나 jQuery가 차이점을 처리하도록 결정했습니다.
Darryl Hein

PHP와 JQuerry는 완전히 멍청하지만 위의 코드는 모든 브라우저에서 작동합니다. 유일한 문제 - 그것은 아이폰에서 잘 작동하지 않습니다, 나는 그것에 대해, 행운 지금까지 :( 질문을 게시 stackoverflow.com/questions/11364040/...
염분이


5

나는 이것이 간단하고 훌륭하게 작동한다는 것을 알았습니다.

for (var i = 0; i < array.length; i++) {
    $('#clientsList').append($("<option></option>").text(array[i].ClientName).val(array[i].ID));
};

4

JSON 형식 :

[{
    "org_name": "Asset Management"
}, {
    "org_name": "Debt Equity Foreign services"
}, {
    "org_name": "Credit Services"
}]

그리고 Ajax 성공시 Dropdown에 값을 채우는 jQuery 코드 :

success: function(json) {
    var options = [];
    $('#org_category').html('');  // Set the Dropdown as Blank before new Data
    options.push('<option>-- Select Category --</option>');
    $.each(JSON.parse(json), function(i, item) {
        options.push($('<option/>',
        {
           value: item.org_name, text: item.org_name
        }));
    });
    $('#org_category').append(options);  // Set the Values to Dropdown
}

3

$ .map () 함수를 사용하면보다 우아한 방식으로이 작업을 수행 할 수 있습니다.

$('#mySelect').html( $.map(selectValues, function(val, key){
    return '<option value="' + val + '">'+ key + '</option>';
}).join(''));

그것은 더 짧지 만, 한 가지 문제는 받아 들여진 대답이하는 val 및 key vars를 피하는 것입니다.
Darryl Hein

2
<!DOCTYPE html>
<html lang="en">
<head>
  <title>append selectbox using jquery</title>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

  <script type="text/javascript">
    function setprice(){
        var selectValues = { "1": "test 1", "2": "test 2" };
        $.each(selectValues, function(key, value) {   
     $('#mySelect')
         .append($("<option></option>")
                    .attr("value",key)
                    .text(value)); 
});

    }
  </script>
</head>
<body onload="setprice();">


      <select class="form-control" id="mySelect">
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
  </select>


</body>
</html>

2

HTML 선택 ID를 아래 행으로 설정하십시오. 여기서는 mySelectselect 요소의 id로 사용됩니다.

   var options = $("#mySelect");

그런 다음이 시나리오에서 selectValues ​​객체를 가져 와서 각 루프의 jquery로 설정하십시오. 그에 따라 객체의 값과 텍스트를 사용하고 다음과 같이 옵션 선택에 추가합니다.

$.each(selectValues, function(val, text) {
            options.append(
             $('<option></option>').val(val).html(text)
          );
      });

드롭 다운 목록을 선택하면 텍스트가 옵션 목록으로 표시되고 텍스트가 선택되면 선택한 텍스트의 값이 사용됩니다.

예 :

"1": "test 1", "2": "test 2",

쓰러지 다,

표시 이름 : 테스트 1-> 값은 1 표시 이름 : 테스트 2-> 값은 2


솔루션에 대해 조금 설명해주세요.
Vinay Prajapati

2

실제로 성능을 향상 시키려면 옵션 목록을 별도로 작성하고 선택 ID에 추가하는 것이 좋습니다.

var options = [];
$.each(selectValues, function(key, value) {
    options.push ($('<option>', { value : key })
          .text(value));
});
 $('#mySelect').append(options);

http://learn.jquery.com/performance/append-outside-loop/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.