¿Cómo selecciona una opción en particular en un elemento SELECT en jQuery?


718

Si conoce el índice, el valor o el texto. también si no tiene una identificación para una referencia directa.

Esto , esto y esto son respuestas útiles.

Marcado de ejemplo

<div class="selDiv">
  <select class="opts">
    <option selected value="DEFAULT">Default</option>
    <option value="SEL1">Selection 1</option>
    <option value="SEL2">Selection 2</option>
  </select>
</div>

46
$("#my_select").val("the_new_value").change();... ... de tan
dsdsdsdsd

Respuestas:


1206

Un selector para obtener el elemento de opción medio por valor es

$('.selDiv option[value="SEL1"]')

Para un índice:

$('.selDiv option:eq(1)')

Para un texto conocido:

$('.selDiv option:contains("Selection 1")')

EDITAR : Como se comentó anteriormente, el OP podría haber estado después de cambiar el elemento seleccionado del menú desplegable. En la versión 1.6 y superior, se recomienda el método prop ():

$('.selDiv option:eq(1)').prop('selected', true)

En versiones anteriores:

$('.selDiv option:eq(1)').attr('selected', 'selected')

EDIT2 : después del comentario de Ryan. Una coincidencia en "Selección 10" podría no ser deseada. No encontré ningún selector que coincida con el texto completo, pero funciona un filtro :

 $('.selDiv option')
    .filter(function(i, e) { return $(e).text() == "Selection 1"})

EDITAR3 : Tenga cuidado con, $(e).text()ya que puede contener una nueva línea que hace que la comparación falle. Esto sucede cuando las opciones están implícitamente cerradas (sin </option>etiqueta):

<select ...>
<option value="1">Selection 1
<option value="2">Selection 2
   :
</select>

Si simplemente utiliza e.textcualquier espacio en blanco adicional, como la nueva línea final, se eliminará, lo que hará que la comparación sea más sólida.


8
: contiene no es genial ya que coincidirá con fragmentos de texto; problemático si alguno de sus textos de opciones es una subcadena de otro texto de opciones.
Ryan

26
Esto también funciona $ ('# id option [value = "0"]'). Attr ('selected', 'selected');
DevC

@Grastveit cómo cambiar el color de la primera opción si se selecciona o no cuando tiene una clase que dice myClass. Gracias
Zaker

@ Usuario No entiendo. ¿Quizás publicarlo en una nueva pregunta? ¿O es $ ('. SelDiv .myClass'). Css ('color', 'red')?
Grastveit

66
Me gustaría agregar que definitivamente debes usar prop y no attr. Casi me vuelvo loco tratando de depurar una aplicación y cambiando de attr a prop lo arreglé.
user609926

125

Ninguno de los métodos anteriores proporcionó la solución que necesitaba, así que pensé que proporcionaría lo que funcionó para mí.

$('#element option[value="no"]').attr("selected", "selected");

10
Tenga en cuenta que a partir de jQuery 1.6 esto debería usarse propy no attr.
Se fue la codificación el

@GoneCoding Using .attres correcto. "selected" es un atributo de la <opción> w3.org/TR/html5/forms.html#attr-option-selected
Carlos Llongo

3
@CarlosLlongo: Eso es irrelevante. La recomendación de jQuery es usar siempre propcon preferencia a attr. Eso ahorra tener que buscar todas y cada una de las propiedades en w3.org para ver si es solo un atributo o implementado con acciones de respaldo.
Se fue la codificación el

82

Puedes usar el val()método:

$('select').val('the_value');

20
Esto está mal porque está CONFIGURANDO el valor de TODOS los elementos SELECCIONAR the_value. ¡.val no es función de selector / filtro! Es un descriptor de acceso de propiedad y pasarle esa cadena establece el valor. Traté de recuperar mi voto a favor, pero fue demasiado tarde después de que realicé esto en las pruebas.
AaronLS

44
¿Tienes 10 votos como respuesta útil? El val () es un getter y un setter. Si solo usa val (), obtendrá el valor. Si pasa algo como val ('the_value') lo está configurando en 'the_value'
Gui

12
Por favor, @AaronLS y @guilhermeGeek, consulte los documentos (último ejemplo). Funciona como un selector para selección, casillas de verificación y botones de opción, y como un configurador de valores para entradas de texto y áreas de texto.
Leandro Ardissone

99
Has leído mal la documentación. Para casillas de verificación, radios y cuadros de lista, el comando establece el atributo "seleccionado" para esos elementos. El último ejemplo muestra cómo pasar val ("casilla de verificación 1") hace que se seleccione. Esto no es lo mismo que un "selector" en términos de obtener los objetos a través de CSS / jquery selector. Probé tu código, no funciona.
AaronLS

27
+1: no, no es un selector de JQuery, sin embargo, creo que la mayoría de las personas que buscan esta pregunta son como yo, y simplemente quieren cambiar la opción seleccionada actualmente; proponer un selector real es simplemente una forma de hacerlo. Y esto es ciertamente mejor que las respuestas que he visto que te hacen iterar sobre todas las opciones.
kdgregory

57

Por valor, lo que funcionó para mí con jQuery 1.7 fue el siguiente código, intente esto:

$('#id option[value=theOptionValue]').prop('selected', 'selected').change();

55
No estoy seguro de que necesite el método .change ().
Phillip Senn

66
El .change()fue necesario. Tuve un ejemplo en el que estaba cambiando miniaturas basadas en un SELECT. Cuando cargué un tema personalizado, se suponía que debía seleccionar "Tema personalizado" de la lista de opciones. La .prop()llamada funcionó, pero sin la .change()imagen en miniatura a la derecha de mi selección nunca se actualizó.
Volomike

2
.change () fue el mejor consejo. +1
Ja8zyjits

1
Nota: un propvalor booleano genera la misma salida. Por ejemplo.prop('selected', true)
Gone Coding

Depende, algunos navegadores, quizás navegadores antiguos, necesitan la cadena 'seleccionado'. Creo que la mayoría de ellos admite la cadena de texto.
mpoletto

16

Hay varias maneras de hacer esto, pero el enfoque más limpio se ha perdido entre las principales respuestas y un montón de argumentos val(). También algunos métodos cambiaron a partir de jQuery 1.6, por lo que esto necesita una actualización.

Para los siguientes ejemplos, asumiré que la variable $selectes un objeto jQuery que apunta a la <select>etiqueta deseada , por ejemplo, a través de lo siguiente:

var $select = $('.selDiv .opts');

Nota 1: use val () para las coincidencias de valor:

Para la coincidencia de valores, usar val()es mucho más simple que usar un selector de atributos: https://jsfiddle.net/yz7tu49b/6/

$select.val("SEL2");

La versión setter de .val()se implementa en las selectetiquetas configurando la selectedpropiedad de una coincidencia optioncon la misma value, por lo que funciona bien en todos los navegadores modernos.

Nota 2 - use prop ('selected', true):

Si desea establecer el estado seleccionado de una opción directamente, puede usar prop(no attr) con un booleanparámetro (en lugar del valor de texto selected):

por ejemplo, https://jsfiddle.net/yz7tu49b/

$option.prop('selected', true);  // Will add selected="selected" to the tag

Nota 3: permita valores desconocidos:

Si usa val()para seleccionar un <option>, pero el valor no coincide (puede suceder dependiendo de la fuente de los valores), entonces se selecciona "nada" y $select.val()volverá null.

Entonces, para el ejemplo que se muestra, y en aras de la robustez, podría usar algo como esto https://jsfiddle.net/1250Ldqn/ :

var $select = $('.selDiv .opts');
$select.val("SEL2");
if ($select.val() == null) {
  $select.val("DEFAULT");
}

Nota 4 - coincidencia exacta del texto:

Si desea hacer coincidir el texto exacto, puede usar una filterfunción con. por ejemplo, https://jsfiddle.net/yz7tu49b/2/ :

var $select = $('.selDiv .opts');
$select.children().filter(function(){
    return this.text == "Selection 2";
}).prop('selected', true);

aunque si tiene espacio en blanco adicional, puede agregar un recorte al cheque como en

    return $.trim(this.text) == "some value to match";

Nota 5 - coincidencia por índice

Si desea hacer coincidir por índice, simplemente indexe los elementos secundarios de la selección, por ejemplo, https://jsfiddle.net/yz7tu49b/3/

var $select = $('.selDiv .opts');
var index = 2;
$select.children()[index].selected = true;

Aunque tiendo a evitar las propiedades DOM directas a favor de jQuery hoy en día, a un código a prueba de futuro, eso también podría hacerse como https://jsfiddle.net/yz7tu49b/5/ :

var $select = $('.selDiv .opts');
var index = 2;
$select.children().eq(index).prop('selected', true);

Nota 6: use change () para activar la nueva selección

En todos los casos anteriores, el evento de cambio no se dispara. Esto es por diseño para que no termines con eventos de cambio recursivo.

Para generar el evento de cambio, si es necesario, simplemente agregue una llamada al objeto .change()jQuery select. Por ejemplo, el primer ejemplo más simple se convierte en https://jsfiddle.net/yz7tu49b/7/

var $select = $('.selDiv .opts');
$select.val("SEL2").change();

También hay muchas otras formas de encontrar los elementos utilizando selectores de atributos, como [value="SEL2"], pero debe recordar que los selectores de atributos son relativamente lentos en comparación con todas estas otras opciones.


13

Puede nombrar la selección y usar esto:

$("select[name='theNameYouChose']").find("option[value='theValueYouWantSelected']").attr("selected",true);

Debe seleccionar la opción que desee.


12
   $(elem).find('option[value="' + value + '"]').attr("selected", "selected");

Gracias por tu publicación, pero ¿qué agrega esta respuesta a la conversación que no está incluida en las respuestas aceptadas?
Edward

si ya hay una opción seleccionada, esta fallará ya que un menú desplegable no puede tener más de un elemento seleccionado a menos que sea una selección múltiple. Necesitas hacer .prop ('selected', true)
derekcohen

9

Respondiendo mi propia pregunta para documentación. Estoy seguro de que hay otras formas de lograr esto, pero esto funciona y este código se prueba.

<html>
<head>
<script language="Javascript" src="javascript/jquery-1.2.6.min.js"></script>
<script type="text/JavaScript">

$(function() {
    $(".update").bind("click",      // bind the click event to a div
        function() {
            var selectOption = $('.selDiv').children('.opts') ;
            var _this = $(this).next().children(".opts") ;

            $(selectOption).find("option[index='0']").attr("selected","selected");
//          $(selectOption).find("option[value='DEFAULT']").attr("selected","selected");
//          $(selectOption).find("option[text='Default']").attr("selected","selected");


//          $(_this).find("option[value='DEFAULT']").attr("selected","selected");
//          $(_this).find("option[text='Default']").attr("selected","selected");
//          $(_this).find("option[index='0']").attr("selected","selected");

    }); // END Bind
}); // End eventlistener

</script>
</head>
<body>
<div class="update" style="height:50px; color:blue; cursor:pointer;">Update</div>
<div class="selDiv">
        <select class="opts">
            <option selected value="DEFAULT">Default</option>
            <option value="SEL1">Selection 1</option>
            <option value="SEL2">Selection 2</option>
        </select>
    </div>
</body>
</html>

9

Exactamente funcionará, pruebe estos métodos a continuación

Para la opción de selección normal

<script>    
    $(document).ready(function() {
    $("#id").val('select value here');
       });
        </script>

Para seleccionar 2 opción, la opción de disparo necesita usar

<script>    
        $(document).ready(function() {
        $("#id").val('select value here').trigger('change');
           });
            </script>


8

Para configurar el valor de selección con la activación seleccionada:

$('select.opts').val('SEL1').change();

Para configurar la opción desde un ámbito:

$('.selDiv option[value="SEL1"]')
    .attr('selected', 'selected')
    .change();

Este código usa el selector para encontrar el objeto seleccionado con condición, luego cambia el atributo seleccionado por attr().


Además, recomiendo agregar un change()evento después de configurar el atributo selected, al hacer esto, el código se cerrará para cambiar la selección por usuario.


6

Lo uso cuando conozco el índice de la lista.

$("#yourlist :nth(1)").prop("selected","selected").change();

Esto permite que la lista cambie y active el evento de cambio. El ": nth (n)" cuenta desde el índice 0


5

Iré con: -

$("select#my-select option") .each(function() { this.selected = (this.text == myVal); });

5

Prueba esto

solo usa select field id en lugar de #id (es decir, # select_name)

en lugar del valor de la opción, use su valor de opción de selección

 <script>
    $(document).ready(function() {
$("#id option[value='option value']").attr('selected',true);
   });
    </script>

3

Para Jquery elegido si envía el atributo a la función y necesita actualizar la opción de selección

$('#yourElement option[value="'+yourValue+'"]').attr('selected', 'selected');
$('#editLocationCity').chosen().change();
$('#editLocationCity').trigger('liszt:updated');

3
/* This will reset your select box with "-- Please Select --"   */ 
    <script>
    $(document).ready(function() {
        $("#gate option[value='']").prop('selected', true);
    });
    </script>

1

Se $('select').val('the_value');ve la solución correcta y si tiene filas de tabla de datos, entonces:

$row.find('#component').val('All');

1

si no desea usar jQuery, puede usar el siguiente código:

document.getElementById("mySelect").selectedIndex = "2";

1

Gracias por la pregunta Espero que este código funcione para ti.

var val = $("select.opts:visible option:selected ").val();

0
$('#select option[data-id-estado="3"]').prop("selected",true).trigger("change");

o

$('#select option[value="myValue"]').prop("selected",true).trigger("change");

Edite su respuesta para que el código esté formateado como código. Haga esto usando la barra de herramientas, o simplemente sangrando todas las líneas de cada bloque de código por cuatro espacios.
beruic
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.