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

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

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

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


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

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>


20

Isto é muito simples:

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

ou

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

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.


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


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

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

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

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>


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

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

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

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.


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

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


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

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

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


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


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

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>

1
$('#select_id').append($('<option>',{ value: v, text: t }));

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

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

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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.