Каков наилучший способ добавить параметры для выбора в качестве объекта JS с помощью jQuery?

1262

Каков наилучший способ добавления параметров в <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:

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

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

  • 4
    Может быть, помочь: texotela.co.uk/code/jquery/select (это была помощь для меня после того, как я наткнулся на этот вопрос)
  • 2
    Перечисленная выше очищенная версия работает только в Jquery 1.4+. Для более старых версий используйте тот, что в ответе Matdumsa
Показать ещё 4 комментария
Теги:
arrays
html-select

34 ответа

1276
Лучший ответ

Как и другие ответы, в режиме jQuery:

$.each(selectValues, function(key, value) {   
     $('#mySelect')
         .append($("<option></option>")
                    .attr("value",key)
                    .text(value)); 
});
  • 87
    Прежде всего, я назначил бы $("#mySelect") , иначе вызов $("#mySelect") каждый раз внутри цикла очень расточителен, как и обновление DOM. Смотрите пункты № 3 и № 6 на artzstudio.com/2009/04/jquery-performance-rules/…
  • 0
    @ Патрик Итак, как вы решаете этот вопрос, Патрик? Скажем, у вас есть группа элементов, как вы справляетесь с этим? (Instad из "$ ('# mySelect')" его "$ ('. Xxx')", так что вы получите группу выбора.)
Показать ещё 10 комментариев
235
var output = [];

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

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

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

Я не уверен, что последняя строка может быть преобразована в $('# mySelect'). Html (output.join('')), потому что я не знаю внутренних компонентов jQuery (возможно, он выполняет некоторый разбор в html() метод) Забастовкa >

  • 19
    Очевидно, что метод You более быстрый, чем «правильный» ответ выше, поскольку он также использует меньше jQuery.
  • 4
    строка "$ ('# mySelect'). get (0) .innerHTML = output.join ('');" работает в Chrome и FF3.x, но не в IE7, насколько я могу судить
Показать ещё 6 комментариев
185

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

$.each(selectValues, function(key, value) {
    $('#mySelect').append($("<option/>", {
        value: key,
        text: value
    }));
});
  • 2
    Отлично. Чтобы добавить его, можно добавить дополнительные атрибуты для выбора. $ .each (selectValues, function (id, value, text) {$ ('# mySelect'). append ($ ("<option />", {id: id value: value, text: text}));} );
  • 44
    Он считает, что лучше будет кэшировать `$ ('# mySelect')`, чтобы вы смотрели только один раз перед циклом. В настоящее время он ищет в DOM элемент для каждой опции.
Показать ещё 2 комментария
79

JQuery

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

Ванильный JavaScript

var list = document.getElementById("selectList");
for(var i in items) {
  list.add(new Option(items[i].text, items[i].value));
}
  • 3
    Никогда раньше не слышал об объекте Option . Это встроено во все браузеры?
  • 3
    да, это так: devguru.com/technologies/ecmascript/quickref/option.html
Показать ещё 4 комментария
32

Использование Плагин 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"));
27

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

$.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(''));
  • 0
    Не означает ли это, что «самым быстрым» способом было бы вставлять различные строковые части как отдельные элементы массива, вместо того, чтобы объединять составляющие каждого параметра перед вставкой в массив, так как все они все равно будут объединены как один в конце?
19

Все эти ответы кажутся излишне сложными. Все что вам нужно:

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

Это полностью совместимо с браузером.

  • 0
    Должен ли это быть new Option(value, key); ? Порядок параметров - Параметры (text_visible_part, value_behind_the_scenes).
  • 0
    Разве Array push не совместим с браузерами? Тогда, разве это не излишне сложно, когда толчок массива более читабелен?
18

@joshperry

Кажется, что обычный .append также работает, как ожидалось,

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

    return $("<option>").val(k).text(v);
  })
);
  • 0
    Вы могли бы альтернативно использовать $.weakmap для GC
  • 2
    Бонусные очки за элегантность: правильно использовать конструкцию map() сочетании со свойством append() для правильного добавления массива объектов!
15

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

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

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

Я сделал несколько тестов, и это, я считаю, делает работу самой быстрой.: P

  • 1
    .each является общеизвестно медленным по сравнению с другими способами достижения того же результата. Это то, о чем я думал и рекомендовал бы этот подход.
  • 0
    К сожалению, 90% вариантов здесь используют $ .each (). Цикл for () может дать вам гораздо больше преимуществ в управлении и производительности, даже если он менее компактен.
12

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

Сначала включите файл шаблонов js, доступный из github.

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

У меня blogged этот подход более подробно.

9

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

Вместо того, чтобы добавлять каждый элемент внутри цикла, лучше собрать элементы в цикле и добавить его после его завершения.

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

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

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

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

$('#select_id').html(items);
  • 0
    $ ( '# Select_id') HTML (элементы). работал точно так, как я хотел. используя append, он продолжает добавлять элементы во все события onchange. Огромное спасибо.
7

Компромисс между двумя верхними ответами в "одном слое":

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

Создает массив элементов Option, используя map, а затем добавляет их все в Select сразу, используя apply для отправки каждый параметр как отдельный аргумент функции append.

7

Простым способом является:

$('#SelectId').html("<option value='0'>select</option><option value='1'>Laguna</option>");
  • 0
    Я уже создал свой список опций, поэтому заполнение поля выбора было таким же простым, как говорит Уиллард.
6
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 посетите: http://www.codecapers.com/post/Dynamic-Select-Lists-with-MVC-and-jQuery.aspx

5

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

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

Затем, чтобы добавить параметр, выполните следующие действия:

$('select').addOption('0', 'None');
  • 0
    Не могли бы вы уточнить?
5
  • $.each медленнее, чем цикл for
  • Каждый раз выбор 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);
  • 0
    где emp_id ?
5
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 только один раз после создания гигантской строки.

  • 0
    вы можете оптимизировать этот процесс и избежать использования jQuery, заменив $("#myselect").empty().append(opts); с getElementById('myselect').innerHtml = opts;
5

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

var options = [];    
$.each(selectValues, function(key, value) {
    options.push($("<option/>", {
        value: key,
        text: value
    }));
});
$('#mySelect').append(options);
  • 0
    Я вижу, что вы здесь сделали ... Вы воспользовались советом для кэширования $('#mySelect') затем реорганизовали ответ @rocktheroad ... как бы то ни было, это более практичное решение
5

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

См. Джона Резига по этому поводу...

Что-то по строкам:

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

Проблема с этим решением в Chrome (jQuery 1.7.1) (сортирует свойства объекта по имени/номеру?) Таким образом, чтобы сохранить порядок (да, это объект злоупотребления), я изменил это:

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

Вы можете просто перебрать ваш json-массив со следующим кодом

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

3

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

2

Формат JSON:

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

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

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
}
2

Что я сделал с двумерными массивами: первый столбец - это элемент i, добавьте к innerHTML в <option>. Второй столбец - record_id i, добавьте к value <option>:

  • 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);
    
  • 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();
        }
    }
    
  • 0
    Выглядит хорошо. Жаль, что он не использует jQuery. Кроме того, раньше у меня были проблемы с методом select.options.add (). Не могу вспомнить, какой браузер и какая именно проблема, но я решил уйти от этого и позволить jQuery разобраться с различиями.
  • 0
    Я полный нуб с PHP и JQuerry, но приведенный выше код работает во всех браузерах. единственная проблема - это не работает на iPhone, я отправил вопрос об этом, пока не повезло :( stackoverflow.com/questions/11364040/…
2

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

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

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

$('#mySelect').html( $.map(selectValues, function(val, key){
    return '<option value="' + val + '">'+ key + '</option>';
}).join(''));
  • 0
    Это немного короче, но одна проблема связана с выходом из val и key vars, что делает принятый ответ.
0

Поскольку JQuery append может принимать массив в качестве аргумента, я удивлен, что никто не предлагал сделать это однострочным с map.

$('#the_select').append(['a','b','c'].map(x => $('<option>').text(x)));
0

На самом деле, для получения улучшенной производительности лучше составить список опций отдельно и добавить идентификатор.

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/

0

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

  1. Иметь дело с ранее выбранной опцией; некоторые браузеры портятся, когда мы добавляем
  2. ТОЛЬКО ударил DOM один раз с добавлением
  3. Работа с 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>
0

Установите свой идентификатор выбора HTML в следующую строку ниже. Здесь mySelect используется как идентификатор элемента select.

   var options = $("#mySelect");

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

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

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

Eg.

"1": "тест 1", "2": "тест 2",

Выпадающее,

отображаемое имя: test 1 → значение равно 1 отображаемое имя: тест 2 → значение 2

  • 0
    пожалуйста, опишите немного о решении.
0
<!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>
  • 0
    На Stack Overflow рекомендуется добавить объяснение того, почему ваше решение должно работать. Для получения дополнительной информации прочитайте, как ответить .
0
$.each(selectValues, function(key, value) {
    $('#mySelect').append($("<option/>", {
        value: key, text: value
    }));
});
0

Я совмещаю два лучших ответа в отличный ответ.

var outputConcatenation = [];

$.each(selectValues, function(i, item) {   
     outputConcatenation.push($("<option></option>").attr("value", item.key).attr("data-customdata", item.customdata).text(item.text).prop("outerHTML"));
});

$("#myselect").html(outputConcatenation.join(''));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню