Каков наилучший способ добавления параметров в <select> из объекта JavaScript с помощью jQuery?

Я ищу что-то, для чего мне не нужен плагин, но я бы также заинтересовался плагинами, которые там есть.

Это то, что я сделал:

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’s :

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

Изменения от matdumsa: (1) убрал закрывающий тег для опции внутри append () и (2) переместил свойства / атрибуты в map как второй параметр append ().

То же, что и в других ответах, в jQuery-стиле:

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

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

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

Таким образом, вы «касаетесь DOM» только один раз.

Ctrl

. Это немного быстрее и чище.

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>

jQuery

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

Плагин Vanilla JavaScript

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

массивов DOM Elements Creator (мой любимый):

$.create('option', {'value': 'val'}, 'myText').appendTo('#mySelect');

Использование имени переменной Option конструктор (не уверен в поддержке браузера):

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

массивов document.createElement (избегая дополнительной работы по синтаксическому анализу HTML с $("<option></option>")):

$('#mySelect').append($(document.createElement("option")).
                        attr("value","val").text("myText"));

Это выглядит лучше, обеспечивает удобочитаемость, но медленнее, чем у других методов.

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

@ joshperry

Кажется, что простой Все эти ответы кажутся излишне сложными. Все, что вам нужно: Предположим, что существует файл Hello.js, который включает в себя две функции «… но та же вкладка!

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

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

Будьте предупреждены … Я использую jQuery Mobile 1.0b2 с PhoneGap 1.0.0 на телефоне Android 2.2 (Cyanogen 7.0.1) (T-Mobile G2 ) и не смог заставить метод .append () работать вообще. Мне пришлось использовать .html () следующим образом:

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

просто

Существует подход, использующий

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

$('#selectMenu').html(options);
 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('');

. Тогда

подход Microsoft Templating , который в настоящее время предлагается для включения. в ядро ​​jQuery. Существует больше возможностей в использовании шаблонов, поэтому для простейшего сценария это может быть не самый лучший вариант. Для получения дополнительной информации см. пост Скотта Гу с описанием возможностей. Сначала включите шаблонный js-файл, доступный от

этого подхода более подробно. github Глядя на вывод

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

Я не думаю, что если кто-то заинтересован в производительности мульти Несколько механизмов, доступных для итераций Array, я подготовил следующие тесты JSPerf:

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

jQuery и другие структуры javascript, инкапсулирующие различные реализации браузера событий DOM уровня 2 в общие модели, так что вы можете писать кросс-браузерный код, не беспокоясь об истории IE как бунтаря. Тот же код с jQuery, все кросс-браузерные и готовые к работе:

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

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

array.splice (start, deleteCount, item1, item2, item3 …) blogged Я сделал что-то вроде этого,

загружая выпадающий элемент через Ajax . Поэтому вместо добавления каждого элемента в цикл лучше собирать элементы в цикле и добавлять его после завершения. . Ответ выше также приемлем, но всегда полезно иметь как можно меньше модификаций DOM для лучшей производительности.

Добавьте его,

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

или даже лучше

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

Компромисс между двумя верхними ответами в виде «одной строки»:

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

Создает массив элементов Option, используя

$.fn.append.apply($('mySelect'),
    $.map(selectValues, function(val, idx) {
        return $("<option/>")
            .val(val.key)
            .text(val.value);
    })
);

для отправки каждого Параметр в качестве отдельного аргумента для map , а затем сразу добавляем их в Select, используя apply. Простой способ: append.

Вместо того, чтобы повторять один и тот же код везде, я хотел бы предложить, что более желательно написать свою собственную функцию jQuery, например:

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

Затем добавить опцию просто сделайте следующее:

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

Хорошо работает с jQuery 1.4.1.

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

Полный текст статьи об использовании динамических списков с ASP.NET MVC & Amp ; jQuery:

http://www.codecapers.com/post/Dynamic-Select-Lists-with -MVC-and-jQuery.aspx медленнее, чем

  1. $.each Каждый раз, выбор DOM не является лучшей практикой в ​​цикле for loop
  2. , поэтому лучшим решением будет следующее $("#mySelect").append();

использовать его как

a инициализируется и определяется. 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);

Существует проблема с сортировкой этого решения в 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));
}); 

еще один способ сделать это:

var options = [];    
$.each(selectValues, function(key, value) {
    options.push($("<option/>", {
        value: key,
        text: value
    }));
});
$('#mySelect').append(options);
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 только один раз после создания гигантской строки.

Хотя все предыдущие ответы являются действительными, может быть целесообразно сначала добавить их в documentFragmnet, а затем добавить этот фрагмент документа как элемент после …

, поэтому ваш код будет работать только после загрузки окна, когда все ресурсы имеют был загружен. В этот момент jQuery ( мыслей Джона Резига по этому вопросу

Что-то вроде:

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);

можно просто перебрать массив json с помощью следующего кода

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

Плагин jQuery можно найти здесь: http://remysharp.com/2007/01/20/auto-population-select-boxes-using-jquery-ajax/ Глядя на вывод

красиво и легко. . Вы должны иметь возможность повторно использовать одно и то же семя для производительности и т. д.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. JavaScript / Ajax

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

формат JSON:

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

и код jQuery для заполнения значений в раскрывающемся списке Ajax success:

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
}

I обнаружил, что это просто и прекрасно работает.

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

Используя функцию $ .map (), вы можете сделать это более элегантным способом:

$('#mySelect').html( $.map(selectValues, function(val, key){
    return '<option value="'   val   '">'  key   '</option>';
}).join(''));
<!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>

и в mySelect используется в качестве идентификатора элемента select.

   var options = $("#mySelect");

затем получите объект, который является selectValues ​​в этом сценарии, и установите его в jquery для каждого цикла. Он будет использовать значение и текст объектов соответственно и добавляет его в варианты выбора следующим образом.

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

Этот текст будет отображаться в виде списка параметров, когда выбран раскрывающийся список, и после выбора текста будет использоваться значение выбранного текста.

напр.

«1»: «тест 1», «2»: «тест 2»,

. И это не требует слишком много шагов.

отображаемое имя: test 1 — & Gt ; равно 1 отображаемому имени: test 2 — & Gt ; равно 2

Я решил немного перезвонить.

  1. Работа с ранее выбранной опцией ; приводит к сбоям в некоторых браузерах, когда мы добавляем
  2. ТОЛЬКО один раз нажимаем на DOM с добавлением
  3. I получил ту же ошибку и исправил ее с помощью следующего PHP-кода в моем внутреннем скрипте: multiple при добавлении дополнительных опций
  4. Показываем, как использовать объект
  5. Показать, как отобразить, используя массив объектов
// objects as value/desc
let selectValues = {
  "1": "test 1",
  "2": "test 2",
  "3": "test 3",
  "4": "test Four"
};
//use div here as using "select" mucks up the original selected value in "mySelect"
let opts = $("<div />");
let opt = {};
$.each(selectValues, function(value, desc) {
  opts.append($('<option />').prop("value", value).text(desc));
});
opts.find("option").appendTo('#mySelect');

// array of objects called "options" in an object
let selectValuesNew = {
  options: [{
      value: "1",
      description: "2test 1"
    },
    {
      value: "2",
      description: "2test 2",
      selected: true
    },
    {
      value: "3",
      description: "2test 3"
    },
    {
      value: "4",
      description: "2test Four"
    }
  ]
};

//use div here as using "select" mucks up the original selected value
let opts2 = $("<div />");
let opt2 = {}; //only append after adding all options
$.map(selectValuesNew.options, function(val, index) {
  opts2.append($('<option />')
    .prop("value", val.value)
    .prop("selected", val.selected)
    .text(val.description));
});
opts2.find("option").appendTo('#mySelectNew');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="mySelect">
  <option value="" selected="selected">empty</option>
</select>

<select id="mySelectNew" multiple="multiple">
  <option value="" selected="selected">2empty</option>
</select>