¿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>');
Haga clic en Upvote
fuente
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);
Josh
fuente
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 
    }));
});
dule
fuente
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));

Dipu
fuente
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');
bobince
fuente
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>

Abrar Jahin
fuente
20

Esto es muy simple:

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

o

$('#select_id').append($('<option>', {
                    value: 1,
                    text: 'One'
                }));
Yesuus Yesuus
fuente
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.

Russ Cam
fuente
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>");

Aurelio De Rosa
fuente
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);
John Magnolia
fuente
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');
szpapas
fuente
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));
caiohamamura
fuente
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>

GSB
fuente
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);
Eduard Florinescu
fuente
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));
});
MaxEcho
fuente
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));
});
Dulith De Costa
fuente
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.

ATOzTOA
fuente
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'));
Ahmed
fuente
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

Peang Peang
fuente
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);
Mcfaith
fuente
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');
Hatim
fuente
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

Robert Nol
fuente
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) !

CPHPython
fuente
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>'));
d-velop
fuente
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>
Muhammad Kamal
fuente
1
$('#select_id').append($('<option>',{ value: v, text: t }));
Cris
fuente
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>')
}
Ronald Valera Santana
fuente
¿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>`);
  });
idiglove
fuente
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);
masmerino
fuente