Dodanie opcji do <select> za pomocą jQuery?

738

Jaki jest najłatwiejszy sposób dodania listy optionrozwijanej za pomocą jQuery?

Czy to zadziała?

$("#mySelect").append('<option value=1>My option</option>');
Kliknij opcję Upvote
źródło
26
Lub użyj, $("#mySelect").html(....)aby zastąpić bieżące opcje nowymi.
Dan Diplo

Odpowiedzi:

265

To NIE działało w IE8 (jeszcze działało w FF):

$("#selectList").append(new Option("option text", "value"));

Ta praca DID:

var o = new Option("option text", "value");
/// jquerify the DOM object 'o' so we can use the html method
$(o).html("option text");
$("#selectList").append(o);
Josh
źródło
1
Miałem problemy z IE8, ale twój kod działał dla mnie, dziękuję!
Alexandre L Telles,
Upewnij się również, że NIEdisplay: table; jest stosowany jako styl do elementu select. To złamie kod js
Gundon
1
Jeśli jesteś zainteresowany, oto błąd dotyczący tego, jak Opcje nie działają z append () w FireFox, Chrome, ale nie w IE: bugs.jquery.com/ticket/1641
JackDev
2
+1 - Pracowałem dla mnie bez konieczności „jarnowania” obiektu. var o = new Option('option text', 'value'); o.innerHTML = 'option text'; document.getElementById('selectList').appendChild(o);
Aust
Istnieje sposób, aby dodać do tego wartości „data-xxx”?
Pedro Joaquín
817

Osobiście wolę tę składnię do dodawania opcji:

$('#mySelect').append($('<option>', {
    value: 1,
    text: 'My option'
}));

Jeśli dodajesz opcje z kolekcji przedmiotów, możesz wykonać następujące czynności:

$.each(items, function (i, item) {
    $('#mySelect').append($('<option>', { 
        value: item.value,
        text : item.text 
    }));
});
dule
źródło
23
będzie to dość powolne, jeśli dodasz wiele opcji, w porównaniu do zwykłego tworzenia ciągu HTML i dołączania go
Kliknij Upvote
3
Działa w IE w przeciwieństwie do wielu rozwiązań
DancesWithBamboo
3
@Ropitems={option1:{value:1,text:1},option2:{value:2,text:2}}
gamliela
4
dzięki @dule, ale jak mogę domyślnie wybrać nową opcję?
Lord_JABA 21.04.16
11
{selected: true}
jmadsen
114

Możesz dodać opcję przy użyciu następującej składni. Możesz także odwiedzić opcję obsługi sposobu w jQuery, aby uzyskać więcej informacji.

  1. $('#select').append($('<option>', {value:1, text:'One'}));

  2. $('#select').append('<option value="1">One</option>');

  3. var option = new Option(text, value); $('#select').append($(option));

Dipu
źródło
1
pierwszy powinien zmienić się na $ („# SectionNames”). append ($ ('<option>', {wartość: 1, tekst: „one”})
EthenHY
1
Drugi ma niepoprawny atrybut w znaczniku opcji ( valuezamiast val). Prawidłowy kod powinien być$('select').append('<option value="1">One</option>');
todd
Dzięki Dipu :))
Lis
45

Jeśli nazwa lub wartość opcji jest dynamiczna, nie będziesz musiał się martwić o ucieczkę w niej znaków specjalnych; w tym możesz preferować proste metody DOM:

var s= document.getElementById('mySelect');
s.options[s.options.length]= new Option('My option', '1');
Bobin
źródło
1
Nie wygląda mi to tak prosto !!
Kliknij Upvote
27
Jest to proste z punktu widzenia javascript, jquery sprawiło, że ludzie
stają się
document.getElementById („mySelect”). add (nowa opcja („Moja opcja”, „1”)); // jeśli IE8 lub lepszy
Hafthor 25.09.13
34

Opcja 1-

Możesz spróbować-

$('#selectID').append($('<option>',
 {
    value: value_variable,
    text : text_variable
}));

Lubię to-

for (i = 0; i < 10; i++)
{ 
     $('#mySelect').append($('<option>',
     {
        value: i,
        text : "Option "+i 
    }));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<select id='mySelect'></select>

Opcja 2-

Lub spróbuj tego-

$('#selectID').append( '<option value="'+value_variable+'">'+text_variable+'</option>' );

Lubię to-

for (i = 0; i < 10; i++)
{ 
     $('#mySelect').append( '<option value="'+i+'">'+'Option '+i+'</option>' );
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<select id='mySelect'></select>

Abrar Jahin
źródło
20

To jest bardzo proste:

$('#select_id').append('<option value="five" selected="selected">Five</option>');

lub

$('#select_id').append($('<option>', {
                    value: 1,
                    text: 'One'
                }));
Yesuus Yesuus
źródło
18

To działa dobrze.

Jeśli dodajesz więcej niż jeden element opcji, zalecam wykonanie append raz, a nie append na każdym elemencie.

Russ Cam
źródło
18

z jakiegokolwiek powodu $("#myselect").append(new Option("text", "text")); nie działa dla mnie w IE7 +

Musiałem użyć $("#myselect").html("<option value='text'>text</option>");

Aurelio De Rosa
źródło
Używam tej samej składni (nowa Opcja (...) w przeglądarce Chrome na Androida (na telefonie) i tam też nie działa
raddevus,
15

Aby zwiększyć wydajność, powinieneś spróbować zmienić DOM tylko raz, tym bardziej, jeśli dodajesz wiele opcji.

var html = '';

for (var i = 0, len = data.length; i < len; ++i) {
    html.join('<option value="' + data[i]['value'] + '">' + data[i]['label'] + '</option>');
}           

$('#select').append(html);
John Magnolia
źródło
1
aby string.join()
zwiększyć
1
To świetne rozwiązanie. Miałem problem z tym, że „join ()” w tym przykładzie nie jest prawidłową funkcją, ale to rozwiązanie pozwala na użycie „obietnicy” jQuery w celu ustalenia, kiedy wszystkie opcje zostały dodane, a DOM jest aktualizowany. W przypadku innych rozwiązań, które dodają opcje jedna po drugiej, nie można tego zrobić tak łatwo. Zamień ostatni wiersz w przykładzie na następujący, aby podjąć działanie dopiero po zakończeniu modyfikacji DOM: $ .when ($ ('(# select'). Append (html)). Done (function () {callSomeFunctionThatRequiresOptionsToBeSet ()} );
Americus
13
$('#mySelect').empty().append('<option value=1>My option</option>').selectmenu('refresh');
szpapas
źródło
8
O ile się nie mylę, to rozwiązanie wymaga nie tylko jQuery, ale także jQueryUI. selectmenu()nie jest częścią rdzenia jQuery i jest widżetem jQueryUI . To sprawia, że ​​jest to dość ciężkie rozwiązanie, prawda?
tatlar
13

Lubię stosować podejście niewymagające zapytania:

mySelect.add(new Option('My option', 1));
caiohamamura
źródło
3
Podoba mi się to, że nie jest jquery;) Nie widzę tego zbyt często
Dakkaron
3
Tak, i chociaż nie mogę kwestionować mocy jquery, są przypadki, że to nie upraszcza rzeczy.
caiohamamura,
11

Możesz dynamicznie dodawać opcje do menu rozwijanego, jak pokazano w poniższym przykładzie. Tutaj w tym przykładzie wziąłem dane tablicy i powiązałem te wartości tablicy z menu rozwijanym, jak pokazano na zrzucie ekranu wyjścia

Wynik:

wprowadź opis zdjęcia tutaj

var resultData=["Mumbai","Delhi","Chennai","Goa"]
$(document).ready(function(){
   var myselect = $('<select>');
     $.each(resultData, function(index, key) {
	     myselect.append( $('<option></option>').val(key).html(key) );
       });
      $('#selectCity').append(myselect.html());
});
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js">
</script>

<select  id="selectCity">

</select>

GSB
źródło
9

W żadnej odpowiedzi nie wspomniano, ale użyteczny jest przypadek, w którym chcesz również wybrać tę opcję, możesz dodać:

var o = new Option("option text", "value");
o.selected=true;
$("#mySelect").append(o);
Eduard Florinescu
źródło
1
Dzięki, musiałem wstępnie wybrać opcję wygenerowaną z JSona i to działało ładnie.
Georg Patscheider,
9
var select = $('#myselect');
var newOptions = {
                'red' : 'Red',
                'blue' : 'Blue',
                'green' : 'Green',
                'yellow' : 'Yellow'
            };
$('option', select).remove();
$.each(newOptions, function(text, key) {
    var option = new Option(key, text);
    select.append($(option));
});
MaxEcho
źródło
5

Istnieją dwa sposoby. Możesz użyć jednego z tych dwóch.

Pierwszy:

$('#waterTransportationFrom').append('<option value="select" selected="selected">Select From Dropdown List</option>');

Druga:

$.each(dataCollecton, function(val, text) {            
    options.append($('<option></option>').val(text.route).html(text.route));
});
Dulith De Costa
źródło
3

Jeśli chcesz wstawić nową opcję do określonego indeksu w zaznaczeniu:

$("#my_select option").eq(2).before($('<option>', {
    value: 'New Item',
    text: 'New Item'
}));

Spowoduje to wstawienie „nowego elementu” jako trzeciego elementu w zaznaczeniu.

ATOzTOA
źródło
3

Możesz dołączyć i ustawić atrybut Value z tekstem:

$("#id").append($('<option></option>').attr("value", '').text(''));
$("#id").append($('<option></option>').attr("value", '4').text('Financial Institutions'));
Ahmed
źródło
3

Znaleźliśmy problem podczas dodawania opcji i sprawdzania poprawności jquery. Musisz kliknąć jeden element na liście wyboru wielu. Dodaj ten kod do obsługi:

$("#phonelist").append("<option value='"+ 'yournewvalue' +"' >"+ 'yournewvalue' +"</option>");

$("#phonelist option:selected").removeAttr("selected"); // add to remove lase selected

$('#phonelist option[value=' + 'yournewvalue' + ']').attr('selected', true); //add new selected

https://i.stack.imgur.com/HOjIY.png

Peang Peang
źródło
3

Co powiesz na to

var numbers = [1, 2, 3, 4, 5];
var option = '';

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

    $('#items').append(option);
Mcfaith
źródło
2

To tylko krótkie punkty za najlepszą wydajność

zawsze, gdy masz do czynienia z wieloma opcjami, zbuduj duży ciąg, a następnie dodaj go do „select”, aby uzyskać najlepszą wydajność

fg

var $ mySelect = $ ('# mySelect'); var str = '';

$.each(items, function (i, item) {
    // IMPORTANT: no selectors inside the loop (for the best performance)
    str += "<option value='" + item.value + "'> " + item.text + "</option>";
});
// you built a big string

$mySelect.html(str); // <-- here you add the big string with a lot of options into the selector.
$mySelect.multiSelect('refresh');

Nawet szybciej

var str = ""; 
for(var i; i = 0; i < arr.length; i++){
    str += "<option value='" + item[i].value + "'> " + item[i].text + "</option>";
}    
$mySelect.html(str);
$mySelect.multiSelect('refresh');
Hatim
źródło
2
$(function () {
     var option = $("<option></option>");
     option.text("Display text");
     option.val("1");
     $("#Select1").append(option);
});

Jeśli otrzymujesz dane z jakiegoś obiektu, po prostu przekaż ten obiekt do działania ...

$(function (product) {
     var option = $("<option></option>");
     option.text(product.Name);
     option.val(product.Id);
     $("#Select1").append(option);
});

Nazwa i identyfikator to nazwy właściwości obiektu ... więc możesz je wywoływać, jak chcesz ... I oczywiście, jeśli masz macierz ... chcesz zbudować niestandardową funkcję za pomocą pętli for ... a następnie po prostu wywołaj tę funkcję w dokument gotowy ... Pozdrawiam

Robert Nol
źródło
2

W oparciu o odpowiedź Dule'a na dodanie kolekcji przedmiotów, jedna linijkafor...in będzie również działać cuda:

let cities = {'ny':'New York','ld':'London','db':'Dubai','pk':'Beijing','tk':'Tokyo','nd':'New Delhi'};

for(let c in cities){$('#selectCity').append($('<option>',{value: c,text: cities[c]}))}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<select  id="selectCity"></select>

Zarówno wartości obiektu, jak i indeksy są przypisane do opcji. To rozwiązanie działa nawet w starym jQuery (v1.4) !

CPHPython
źródło
1

jeśli masz opcję optgroup wewnątrz Select , masz błąd w DOM.

Myślę, że najlepszym sposobem:

$("#select option:last").after($('<option value="1">my option</option>'));
d-velop
źródło
1

Możesz wypróbować poniższy kod, aby dołączyć do opcji

  <select id="mySelect"></select>

    <script>
          $("#mySelect").append($("<option></option>").val("1").html("My enter code hereoption"));
    </script>
Muhammad Kamal
źródło
1
$('#select_id').append($('<option>',{ value: v, text: t }));
Cris
źródło
1

W ten sposób to zrobiłem za pomocą przycisku, aby dodać każdy tag wyboru.

$(document).on("click","#button",function() {
   $('#id_table_AddTransactions').append('<option></option>')
}
Ronald Valera Santana
źródło
Czy tak powinno być$(document).ready(function(){ $("#button").click(function() { $('#id_table_AddTransactions').append('<option></option>'); }); });
Bariq Dharmawan
Tak, masz rację. Moja odpowiedź nie zawierała gotowego oświadczenia, ponieważ skupiłem się na tym, co rozwiązało problem.
Ronald Valera Santana
1

Możesz to zrobić w ES6:

$.each(json, (i, val) => {
    $('.js-country-of-birth').append(`<option value="${val.country_code}"> ${val.country} </option>`);
  });
idiglove
źródło
1

Jeśli ktoś tu przyjdzie i szuka sposobu na dodanie opcji z właściwościami danych

Korzystanie z attr

var option = $('<option>', { value: 'the_value', text: 'some text' }).attr('family', model.family);

Korzystanie z danych - dodano wersję 1.2.3

var option = $('<option>', { value: 'the_value', text: 'some text' }).data('misc', 'misc-value);
masmerino
źródło