Adicionando opções a um <select> usando jQuery?

739

Qual é a maneira mais fácil de adicionar um optiona um menu suspenso usando jQuery?

Isso vai funcionar?

$("#mySelect").append('<option value=1>My option</option>');
Click Voto a favor
fonte
26
Ou use $("#mySelect").html(....)para substituir as opções atuais pelas novas.
Dan Diplo

Respostas:

267

Isso NÃO funcionou no IE8 (ainda funcionou no FF):

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

Este trabalho 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
fonte
1
Eu estava tendo problemas com o IE8, mas seu código funcionou para mim, obrigado!
Alexandre L Telles
Verifique também se NÃOdisplay: table; é aplicado como estilo ao elemento de seleção. Isso irá quebrar o código js
Gundon
1
Se você estiver interessado, aqui está o erro relativo a como as opções não funciona com append () funciona no Firefox, Chrome, mas não no IE: bugs.jquery.com/ticket/1641
JackDev
2
+1 - Trabalhou para mim sem precisar 'jquerificar' o objeto. var o = new Option('option text', 'value'); o.innerHTML = 'option text'; document.getElementById('selectList').appendChild(o);
Aust
Existe uma maneira de adicionar valores "data-xxx" a isso?
Pedro Joaquín
817

Pessoalmente, prefiro esta sintaxe para anexar opções:

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

Se você estiver adicionando opções de uma coleção de itens, poderá fazer o seguinte:

$.each(items, function (i, item) {
    $('#mySelect').append($('<option>', { 
        value: item.value,
        text : item.text 
    }));
});
dule
fonte
23
este será bastante lento se você está adicionando um monte de opções, em comparação com apenas construindo uma string html e acrescentá-lo
Clique Upvote
3
Funciona no IE ao contrário de um monte de soluções
DancesWithBamboo
3
@Ropitems={option1:{value:1,text:1},option2:{value:2,text:2}}
gamliela
4
obrigado @dule, mas como posso fazer nova opção selecionada por padrão?
Lord_JABA
11
{selected: true}
jmadsen 13/01/17
115

Você pode adicionar a opção usando a seguinte sintaxe. Também pode visitar a opção de manipulação de maneira no jQuery para obter mais detalhes.

  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
fonte
1
o primeiro deve mudar para $ ("# SectionNames"). append ($ ('<option>', {value: 1, text: "one"}))
EthenHY
1
O segundo possui um atributo incorreto na tag de opção (em valuevez de val). O código correto deve ser$('select').append('<option value="1">One</option>');
todd
Obrigado Dipu :))
Fox
45

Se o nome ou o valor da opção for dinâmico, você não precisará se preocupar com o escape de caracteres especiais; nisso, você pode preferir métodos DOM simples:

var s= document.getElementById('mySelect');
s.options[s.options.length]= new Option('My option', '1');
bobince
fonte
1
Não parece tão simples para mim !!
Clique em Upvote
27
Isto é simples em termos de javascript, jquery tornou as coisas muito fácil para as pessoas
DWolf
document.getElementById ('mySelect'). add (new Option ('Minha opção', '1')); // se IE8 ou melhor
Hafthor
34

Opção 1-

Você pode tentar isso-

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

Como isso-

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>

Opção 2-

Ou tente isso-

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

Como isso-

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
fonte
20

Isto é muito simples:

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

ou

$('#select_id').append($('<option>', {
                    value: 1,
                    text: 'One'
                }));
Yesuus Yesuus
fonte
18

Isso funciona bem.

Se você adicionar mais de um elemento de opção, recomendo executar o acréscimo uma vez, em vez de um acréscimo em cada elemento.

Russ Cam
fonte
18

por qualquer motivo, $("#myselect").append(new Option("text", "text"));não está funcionando para mim no IE7 +

Eu tive que usar $("#myselect").html("<option value='text'>text</option>");

Aurelio De Rosa
fonte
Eu estou usando essa mesma sintaxe (nova opção (...) no navegador Chrome para Android (em um telefone) e não está trabalhando lá.
raddevus
15

Para ajudar no desempenho, você deve tentar alterar o DOM apenas uma vez, ainda mais se estiver adicionando muitas opções.

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
fonte
1
para o desempenho de ajuda você deve usar string.join()para concatenar cadeias
mfeineis
1
Esta é uma otima soluçao. Eu tive um problema com "join ()" no exemplo, não sendo uma função válida, mas esta solução permite que você use uma "promessa" do jQuery para determinar quando todas as opções foram adicionadas e o DOM terminou de atualizar. Com as outras soluções que adicionam opções uma por uma, isso não pode ser feito com a mesma facilidade. Substitua a última linha do exemplo pelo seguinte para executar uma ação somente após a conclusão da modificação do DOM: $ .when ($ ('# select'). Append (html)). Done (function () {callSomeFunctionThatRequiresOptionsToBeSet ()} );
Americus
13
$('#mySelect').empty().append('<option value=1>My option</option>').selectmenu('refresh');
szpapas
fonte
8
A menos que eu esteja enganado, esta solução não só requer jQuery, mas também jQueryUI. selectmenu()não faz parte do núcleo do jQuery e é um widget do jQueryUI . Isso a torna uma solução bastante pesada, não?
Tatlar 21/05
13

Eu gosto de usar a abordagem não jquery:

mySelect.add(new Option('My option', 1));
caiohamamura
fonte
3
Gosto de ser ser não-jQuery;) Você não achou que muitas vezes
Dakkaron
3
Sim, e embora eu não possa questionar o poder do jquery, há casos em que isso não simplifica as coisas.
precisa saber é o seguinte
11

Você pode adicionar opções dinamicamente ao menu suspenso, como mostrado no exemplo abaixo. Aqui neste exemplo, peguei os dados da matriz e vinculei esses valores à lista suspensa, como mostrado na captura de tela de saída

Resultado:

insira a descrição da imagem aqui

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
fonte
9

Não mencionado em nenhuma resposta, mas útil é o caso em que você deseja que essa opção também seja selecionada, você pode adicionar:

var o = new Option("option text", "value");
o.selected=true;
$("#mySelect").append(o);
Eduard Florinescu
fonte
1
Obrigado, eu precisava pré-selecionar uma opção gerada a partir de json e isso funcionou muito bem.
Georg Patscheider 12/12
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
fonte
5

Existem duas maneiras. Você pode usar um desses dois.

Primeiro:

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

Segundo:

$.each(dataCollecton, function(val, text) {            
    options.append($('<option></option>').val(text.route).html(text.route));
});
Dulith De Costa
fonte
3

Se você deseja inserir a nova opção em um índice específico na seleção:

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

Isso inserirá o "Novo item" como o terceiro item na seleção.

ATOzTOA
fonte
3

Você pode anexar e definir o atributo Value com o texto:

$("#id").append($('<option></option>').attr("value", '').text(''));
$("#id").append($('<option></option>').attr("value", '4').text('Financial Institutions'));
Ahmed
fonte
3

Encontramos algum problema quando você anexa a opção e usa o jquery validate. Você deve clicar em um item na lista de seleção múltipla. Você adicionará este código para lidar com:

$("#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

Amendoim Amendoim
fonte
3

Que tal agora

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

Este é apenas um ponto rápido para obter o melhor desempenho

sempre que estiver lidando com muitas opções, construa uma grande string e adicione-a ao 'select' para obter o melhor desempenho

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

Ainda mais rápido

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
fonte
2
$(function () {
     var option = $("<option></option>");
     option.text("Display text");
     option.val("1");
     $("#Select1").append(option);
});

Se você estiver obtendo dados de algum objeto, basta encaminhar esse objeto para funcionar ...

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

Nome e ID são nomes de propriedades do objeto ... para que você possa chamá-los como quiser ... E, claro, se você tiver Array ... deseja criar uma função personalizada com o loop for ... e depois chamar essa função em documento pronto ... Felicidades

Robert Nol
fonte
2

Com base na resposta do dule para anexar uma coleção de itens, um one-linerfor...in também fará maravilhas:

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>

Valores e índices de objetos são atribuídos às opções. Esta solução funciona mesmo no jQuery antigo (v1.4) !

CPHPython
fonte
1

se você tiver optgroup dentro de select , obteve um erro no DOM.

Eu acho que a melhor maneira:

$("#select option:last").after($('<option value="1">my option</option>'));
d-velop
fonte
1

Você pode tentar o código abaixo para anexar à opção

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

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

Foi assim que eu fiz, com um botão para adicionar cada tag de seleção.

$(document).on("click","#button",function() {
   $('#id_table_AddTransactions').append('<option></option>')
}
Ronald Valera Santana
fonte
Será que deveria ser$(document).ready(function(){ $("#button").click(function() { $('#id_table_AddTransactions').append('<option></option>'); }); });
Bariq Dharmawan
Sim, você está certo sobre isso. Minha resposta não incluiu a declaração pronta porque, eu me concentrei no que resolveu o problema.
Ronald Valera Santana
1

Você pode fazer isso no ES6:

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

Se alguém vier aqui procurando uma maneira de adicionar opções com propriedades de dados

Usando attr

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

Usando dados - versão adicionada 1.2.3

var option = $('<option>', { value: 'the_value', text: 'some text' }).data('misc', 'misc-value);
masmerino
fonte