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.