¿Agregar opciones a un <select> usando jQuery?


739

¿Cuál es la forma más fácil de agregar un elemento optiona un menú desplegable usando jQuery?

esto funcionara?

$("#mySelect").append('<option value=1>My option</option>');

26
O use $("#mySelect").html(....)para reemplazar las opciones actuales con las nuevas.
Dan Diplo

Respuestas:


267

Esto NO funcionó en IE8 (pero sí en FF):

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

Este trabajo sí:

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
Estaba teniendo problemas con IE8, pero su código funcionó para mí, ¡gracias!
Alexandre L Telles

También asegúrese de que display: table;se NO aplica como estilo al elemento de selección. Esto romperá el código js
Gundon

1
Si está interesado, aquí está el error relacionado con cómo las opciones no funcionan con append () funciona en Firefox, Chrome, pero no en IE: bugs.jquery.com/ticket/1641
JackDev

2
+1: funcionó para mí sin tener que 'jquerificar' el objeto. var o = new Option('option text', 'value'); o.innerHTML = 'option text'; document.getElementById('selectList').appendChild(o);
Aust

¿Hay alguna forma de agregar valores "data-xxx" a esto?
Pedro Joaquín

817

Personalmente, prefiero esta sintaxis para agregar opciones:

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

Si agrega opciones de una colección de elementos, puede hacer lo siguiente:

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

23
esto será bastante lento si agrega muchas opciones, en comparación con solo construir una cadena html y agregarla
haga clic en Votar a favor el

3
Funciona en IE a diferencia de muchas soluciones
DancesWithBamboo

3
@Ropitems={option1:{value:1,text:1},option2:{value:2,text:2}}
gamliela

44
gracias @dule, pero ¿cómo puedo hacer una nueva opción seleccionada por defecto?
Lord_JABA

11
{selected: true}
jmadsen

115

Puede agregar la opción utilizando la siguiente sintaxis. También puede visitar la opción de manejo en jQuery para obtener más detalles.

  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
el primero debe cambiar a $ ("# SectionNames"). append ($ ('<option>', {value: 1, text: "one"})
EthenHY

1
El segundo tiene un atributo incorrecto en la etiqueta de opción (en valuelugar de val). El código correcto debería ser$('select').append('<option value="1">One</option>');
todd

Gracias Dipu :))
Fox

45

Si el nombre o el valor de la opción es dinámico, no querrá preocuparse por escapar de caracteres especiales; en esto puede preferir métodos DOM simples:

var s= document.getElementById('mySelect');
s.options[s.options.length]= new Option('My option', '1');

1
¡No me parece tan simple!
Haga clic en Upvote el

27
Esto es simple en términos de JavaScript, jquery ha hecho las cosas demasiado fáciles para las personas
DWolf

document.getElementById ('mySelect'). add (nueva Opción ('Mi opción', '1')); // si IE8 o mejor
Hafthor

34

Opción 1-

Puedes probar esto

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

Me gusta esto-

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>

Opcion 2-

O prueba esto

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

Me gusta esto-

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

Esto es muy simple:

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

o

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

18

Eso funciona bien

Si agrega más de un elemento de opción, recomendaría realizar la adición una vez en lugar de realizar una adición en cada elemento.


18

por alguna razón, hacer $("#myselect").append(new Option("text", "text"));no funciona para mí en IE7 +

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


Estoy usando esa misma sintaxis (nueva Opción (...) en el navegador Android Chrome (en un teléfono) y tampoco funciona allí.
raddevus

15

Para ayudar al rendimiento, debe tratar de alterar solo el DOM una vez, incluso más si agrega muchas opciones.

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 ayudar al rendimiento que debe usar string.join()para concatenar cadenas
mfeineis

1
Esta es una gran solución. Tuve un problema con "join ()" en el ejemplo que no es una función válida, pero esta solución le permite usar una "promesa" jQuery para determinar cuándo se han agregado todas las opciones y el DOM se ha actualizado. Con las otras soluciones que agregan opciones una por una, esto no se puede hacer tan fácilmente. Reemplace la última línea del ejemplo con lo siguiente para realizar una acción solo después de que se complete la modificación del 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 me equivoque, esta solución no solo requiere jQuery, sino también jQueryUI. selectmenu()no es parte del núcleo jQuery y es un widget jQueryUI . Eso lo convierte en una solución bastante dura, ¿no?
tatlar

13

Me gusta usar el enfoque no jquery:

mySelect.add(new Option('My option', 1));

3
Me gusta que no sea jquery;) No veo eso con demasiada frecuencia
Dakkaron

3
Sí, y aunque no puedo cuestionar el poder de jquery, hay casos en que no simplifica las cosas.
caiohamamura

11

Puede agregar opciones dinámicamente en el menú desplegable como se muestra en el siguiente ejemplo. Aquí, en este ejemplo, tomé los datos de la matriz y agarré el valor de la matriz al menú desplegable como se muestra en la captura de pantalla de salida

Salida:

ingrese la descripción de la imagen aquí

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

No se menciona en ninguna respuesta, pero útil es el caso en el que desea que también se seleccione esa opción, puede agregar:

var o = new Option("option text", "value");
o.selected=true;
$("#mySelect").append(o);

1
Gracias, necesitaba preseleccionar una opción generada desde json y funcionó muy bien.
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));
});

5

Hay dos maneras. Puedes usar cualquiera de estos dos.

Primero:

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

Si desea insertar la nueva opción en un índice específico en la selección:

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

Esto insertará el "Nuevo elemento" como el tercer elemento en la selección.


3

Puede agregar y establecer el atributo Value con texto:

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

3

Encontramos algún problema cuando agrega una opción y usa jquery validate. Debe hacer clic en un elemento en la lista de selección múltiple. Agregará este código para manejar:

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

Qué tal esto

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

Estos son solo puntos rápidos para el mejor rendimiento

siempre que trabaje con muchas opciones, cree una cadena grande y luego agréguela a 'seleccionar' para obtener el mejor rendimiento

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

Aun más 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);
});

Si obtiene datos de algún objeto, simplemente reenvíe ese objeto para que funcione ...

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

Nombre e Id son nombres de propiedades de objetos ... para que pueda llamarlos como quiera ... Y, por supuesto, si tiene Array ... desea construir una función personalizada con for loop ... y luego simplemente llame a esa función en documento listo ... Saludos


2

Basado en la respuesta de dule para agregar una colección de artículos, una frasefor...in también hará maravillas:

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>

Los valores e índices de los objetos se asignan a las opciones. ¡Esta solución funciona incluso en la antigua jQuery (v1.4) !


1

si tienes optgroup dentro de select , tienes un error en DOM.

Creo que la mejor manera:

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

1

U puede probar el siguiente código para agregar a la opción

  <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

Así lo hice, con un botón para agregar cada etiqueta de selección.

$(document).on("click","#button",function() {
   $('#id_table_AddTransactions').append('<option></option>')
}

¿Debería ser?$(document).ready(function(){ $("#button").click(function() { $('#id_table_AddTransactions').append('<option></option>'); }); });
Bariq Dharmawan

Sí, tienes razón en eso. Mi respuesta no incluyó la declaración lista porque, me concentré en lo que resolvió el problema.
Ronald Valera Santana

1

Puedes hacer esto en ES6:

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

1

Si alguien viene aquí buscando una manera de agregar opciones con propiedades de datos

Usando attr

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

Uso de datos - versión agregada 1.2.3

var option = $('<option>', { value: 'the_value', text: 'some text' }).data('misc', 'misc-value);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.