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.

DanSingerman
fuente
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>

Creciente Fresco
fuente
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); });
Spoulson
fuente
90

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

$("#my-Select option[text=" + myText +"]").prop("selected", true);
Jay Corbett
fuente
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 :)

ErazerBrecht
fuente
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.

Russ Cam
fuente
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;
}
Dave
fuente
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.

Losbear
fuente
10

Esta línea funcionó:

$("#myDropDown option:contains(myText)").attr('selected', true);
Diego Unanue
fuente
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á

aWebDeveloper
fuente
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.

RParker
fuente
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
5

Aquí es de manera muy simple. por favor úsalo

$("#free").val("y").change();
Pankaj Chauhan
fuente
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);

Vitor Silva
fuente
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.

Ammar Bukhari
fuente
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");

Chris Edwards
fuente
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; 
} 
Keith
fuente
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');
});
tomjm
fuente
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

Sam Alexander
fuente
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..."));
DominionDave
fuente
-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.

geowa4
fuente