jQuery: establece el valor seleccionado de un control de selección a través de su descripción de texto


530

Tengo un control de selección, y en una variable de JavaScript tengo una cadena de texto.

Usando jQuery, quiero establecer que el elemento seleccionado del control select sea el elemento con la descripción de texto que tengo (en oposición al valor, que no tengo).

Sé que establecerlo por valor es bastante trivial. p.ej

$("#my-select").val(myVal);

Pero estoy un poco perplejo al hacerlo a través de la descripción del texto. Supongo que debe haber una forma de obtener el valor de la descripción del texto, pero mi cerebro está demasiado ocupado el viernes por la tarde para poder resolverlo.


1
@DanAtkinson estaba a punto de hacer lo mismo yo mismo. select no tiene absolutamente nada que ver con esta pregunta.
thecoshman

Respuestas:


757

Seleccionar por descripción para jQuery v1.6 +

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).prop('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

jQuery versiones inferiores a 1.6 y mayores o iguales a 1.4

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).attr('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

Tenga en cuenta que si bien este enfoque funcionará en versiones superiores a 1.6 pero inferiores a 1.9, ha quedado en desuso desde 1.6. No funcionará en jQuery 1.9+.


Versión anterior

val() debe manejar ambos casos.

$('select').val('1'); // selects "Two"
$('select').val('Two'); // also selects "Two"
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>


66
Parece que no debería funcionar (parece que podría ser ambiguo), pero en realidad debería funcionar bien para mí. Gracias.
DanSingerman

69
Tenga en cuenta que jQuery 1.4 ahora ha cambiado este comportamiento para seleccionar valuesi se ha especificado el atributo, y solo seleccionar por texto si valuefalta el atributo. Entonces, en este ejemplo $('select').val('Two'), seleccionará la segunda opción en 1.3.x, pero no hará nada en 1.4.x.
Crescent Fresh

18
Entonces, ¿cuál es la mejor manera de hacerlo en 1.4 ahora?
JR Lawhorne

44
En versiones más recientes de jQuery, .val ('no-un-valor-opción') restablecerá la selección a la primera opción.
Dland

55
La primera respuesta a esta pregunta parece ser la solución post 1.3.x stackoverflow.com/questions/3644449/…
DA.

142

No he probado esto, pero esto podría funcionar para ti.

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

90

Pruebe esto ... para seleccionar la opción con texto myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);

La respuesta de @ spoulson funcionó para mí ... Traté de hacerlo sin el .each
Jay Corbett

2
En muchos casos, este enfoque no funciona desafortunadamente. Incluso tuve que resolver el $("#my-Select option[text=" + myText +"]").get(0).selected = true;estilo clásico de vez en cuando: (...
Shahriyar Imanov

2
Asegúrese de eliminar primero el atributo seleccionado antes de volver a configurarlo; de lo contrario, parecerá que no funciona (funciona para mí en 1.9)
esse

3
@ MarkW Para 1.9, use en .proplugar de .attr; La causa del cambio es que en 1.9 jQuery deshabilitó los viejos hacks que le permiten .attrcambiar algunas propiedades DOM así como también los atributos HTML. (Google javascript dom properties vs attributessi no conoce la distinción.)
Mark Amery

Respuesta actualizada para usar en .prop('selected', true)lugar de .attr('selected', 'selected')para jQuery 1.9+ compatibilidad.
erwaman

43

Lo hago de esta manera (jQuery 1.9.1)

$("#my-select").val("Dutch").change();

Nota: no olvide el cambio (), tuve que buscar mucho tiempo por eso :)


2
Ojalá pudiera votar varias veces. Ya pasó una hora para dejar de fumar y ahora puedo irme a casa.
Bob Jordan

¡Gran respuesta! breve y simple ... Esto debería estar en la cima ... Sigue votando.
Muhammad Tarique

Esto funcionó en mi caso, gracias! Pero, ¿no selecciona esto no por el texto mostrado, como lo solicitó el OP, sino por el valor en sí mismo, que el OP no tiene?
Brandon Rhodes

21
$("#myselect option:contains('YourTextHere')").val();

devolverá el valor de la primera opción que contiene su descripción de texto. Probado esto y funciona.


Gracias. Creo que esta podría ser la versión que uso, ya que también necesito tener lógica para cuando no hay texto coincidente, y este parece ser el mecanismo más fácil para poder hacerlo.
DanSingerman

1
Tenga en cuenta que solo obtendrá el valor de la primera opción que coincida con el texto.
Russ Cam

Además, podría encadenar attr ("selected", "selected") en el conjunto envuelto en lugar de val () y esto funcionaría de manera similar a la respuesta de CarolinaJay65
Russ Cam

1
OP dijo que " establecer valor" no " obtener valor"
RousseauAlexandre

15

Para evitar todas las complicaciones de la versión jQuery, honestamente recomiendo usar una de estas funciones javascript realmente simples ...

function setSelectByValue(eID,val)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].value==val) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

function setSelectByText(eID,text)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].text==text) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

Permite la selección de una opción de selección mediante valor o texto (según la función llamada). Por ejemplo: setSelectByValue ('salchichas', '2'); Encontrará y seleccionará la opción con el valor "2" en el objeto de selección con una identificación de "salchichas".
Dave

2
@Neal Uh ... ¿responde la pregunta?
Mark Amery

10

Sé que esta es una publicación antigua, pero no pude seleccionarla por texto usando jQuery 1.10.3 y las soluciones anteriores. Terminé usando el siguiente código (variación de la solución de spoulson):

      var textToSelect = "Hello World";

      $("#myDropDown option").each(function (a, b) {
            if ($(this).html() == textToSelect ) $(this).attr("selected", "selected");
        });

Espero que ayude a alguien.


10

Esta línea funcionó:

$("#myDropDown option:contains(myText)").attr('selected', true);

7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

La declaración if no coincide exactamente con "dos" y "dos tres" no coincidirá


No, eso no es lo que quise decir. Creo que mi comentario fue un poco confuso, así que lo eliminé. Sin embargo, voté tu respuesta porque funcionó para mi situación.
Jagd

6

La forma más fácil con 1.7+ es:

$("#myDropDown option:text=" + myText +"").attr("selected", "selected"); 

1.9+

$("#myDropDown option:text=" + myText +"").prop("selected", "selected"); 

Probado y funciona.


1
No en 1.9+ no lo hace. Desde 1.6 debería usar .proppara cambiar las propiedades DOM, no .attr(que es para los atributos HTML / DOM). Ver stackoverflow.com/q/5874652/1709587
Mark Amery el

Usaría ("selected", true) en lugar del valor verdadero de "selected"
mplungjan


4

eche un vistazo al complemento jquery selectedbox

selectOptions(value[, clear]): 

Seleccione las opciones por valor, utilizando una cadena como parámetro $("#myselect2").selectOptions("Value 1");o una expresión regular $("#myselect2").selectOptions(/^val/i);.

También puede borrar las opciones ya seleccionadas: $("#myselect2").selectOptions("Value 2", true);


3

Solo en una nota al margen. Mi valor seleccionado no se estaba configurando. Y tuve que buscar por toda la red. En realidad, tuve que seleccionar un valor después de una llamada desde un servicio web, porque estaba obteniendo datos de él.

$("#SelectMonth option[value=" + DataFromWebService + "]").attr('selected', 'selected'); 
$("#SelectMonth").selectmenu('refresh', true);

Así que la actualización del selector fue lo único que me faltaba.


Este es el correcto, aunque ... no veo ninguna razón para la segunda línea. Debería funcionar como está.
Sagive SEO

2

Descubrí que al usarlo attrterminaría con múltiples opciones seleccionadas cuando no quisiera: la solución es usar prop:

$("#myDropDown option:text=" + myText +"").prop("selected", "selected");


1

Tuve un problema con los ejemplos anteriores, y el problema fue causado por el hecho de que mis valores de cuadro de selección se rellenan previamente con cadenas de longitud fija de 6 caracteres, pero el parámetro que se pasó no tenía una longitud fija.

Tengo una función rpad que rellenará a la derecha una cadena, a la longitud especificada y con el carácter especificado. Entonces, después de rellenar el parámetro, funciona.

$('#wsWorkCenter').val(rpad(wsWorkCenter, 6, ' '));


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 

1
 $('#theYear').on('change', function () {
 FY = $(this).find('option:selected').text();
 $('#theFolders').each(function () {
     $('option:not(:contains(' + FY + '))', this).hide();
 });
 $('#theFolders').val(0);
});

$('#theYear').on('mousedown', function () {
 $('#theFolders option').show().find('option:contains("Select")', this).attr('selected', 'selected');
});

0

Esta respuesta aceptada no parece correcta, mientras que .val ('newValue') es correcto para la función, intentar recuperar una selección por su nombre no funciona para mí, tuve que usar el id y el nombre de clase para obtener mi elemento


0

Heres una opción fácil. Simplemente configure su opción de lista y luego configure su texto como valor seleccionado:

$("#ddlScheduleFrequency option").selected(text("Select One..."));

-1

Obtenga los hijos del cuadro de selección; bucle a través de ellos; cuando haya encontrado el que desea, configúrelo como la opción seleccionada; devuelve falso para detener el bucle.

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.