jQuery - definindo o valor selecionado de um controle de seleção por meio de sua descrição de texto

530

Eu tenho um controle select e, em uma variável javascript, tenho uma string de texto.

Usando jQuery, desejo definir o elemento selecionado do controle select como o item com a descrição de texto que tenho (em oposição ao valor, que não tenho).

Eu sei que defini-lo por valor é bastante trivial. por exemplo

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

Mas estou um pouco perplexo ao fazê-lo através da descrição do texto. Acho que deve haver uma maneira de extrair o valor da descrição do texto, mas meu cérebro está muito atrasado na sexta-feira para poder resolver isso.

DanSingerman
fonte
1
@ DanAtkinson estava prestes a fazer o mesmo. O select não tem absolutamente nada a ver com essa pergunta.
thecoshman

Respostas:

757

Selecione por descrição para o 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>

Versões jQuery abaixo de 1,6 e maiores que ou iguais 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>

Observe que, embora essa abordagem funcione em versões superiores a 1,6, mas inferiores a 1,9, ela foi preterida desde a versão 1.6. Não funcionará no jQuery 1.9+.


Versões prévias

val() deve lidar com os dois 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>

Crescent Fresh
fonte
6
Parece que não deve funcionar (parece que pode ser ambíguo), mas na verdade deve funcionar bem para mim. Obrigado.
DanSingerman
69
Observe que o jQuery 1.4 agora alterou esse comportamento para selecionar valuese o atributo foi especificado e somente selecionar por texto se o valueatributo estiver ausente. Portanto, neste exemplo $('select').val('Two'), selecione a segunda opção no 1.3.x, mas não fará nada no 1.4.x.
Crescent Fresh
18
Então, qual é a melhor maneira de fazer isso na versão 1.4 agora?
JR Lawhorne #
4
Nas versões mais recentes do jQuery, .val ('não é um valor de opção') redefinirá a seleção para a primeira opção.
dland
5
A primeira resposta a esta pergunta parece ser a solução post 1.3.x stackoverflow.com/questions/3644449/…
DA.
142

Não testei isso, mas isso pode funcionar para você.

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

Tente isto ... para selecionar a opção com o texto myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);
Jay Corbett
fonte
@ resposta de spoulson funcionou para mim ... Eu tentei fazê-lo sem a .each
Jay Corbett
2
Em muitos casos, essa abordagem não funciona infelizmente. Eu até tive que resolver o $("#my-Select option[text=" + myText +"]").get(0).selected = true;estilo clássico de tempos em tempos: (...
Shahriyar Imanov
2
Certifique-se que você é primeiro remover o atributo selecionado antes de re-configuração, caso contrário ele não aparecerá para o trabalho (trabalha para mim em 1.9)
ESSE
3
@ MarkW Para 1.9, use em .propvez de .attr; a causa da mudança é que, no 1.9, o jQuery desativou os hacks antigos que permitem usar .attralgumas propriedades do DOM e atributos HTML. (Google javascript dom properties vs attributes, se você não sabe a diferença.)
Mark Amery
Resposta atualizada a ser usada em .prop('selected', true)vez da .attr('selected', 'selected')compatibilidade com o jQuery 1.9+.
erwaman 16/01
43

Eu faço dessa maneira (jQuery 1.9.1)

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

Nota: não esqueça a mudança (), tive que pesquisar muito por causa disso :)

ErazerBrecht
fonte
2
Gostaria de poder votar várias vezes. Já passou de uma hora e agora eu posso ir para casa.
Bob Jordan
Ótima resposta! curto e simples ... Isso deve estar no topo ... Continue votando.
Muhammad Tarique
Isso funcionou no meu caso, obrigado! Mas isso não é selecionado pelo texto exibido, conforme solicitado pelo OP, mas pelo próprio valor, que o OP não possui?
Brandon Rhodes
21
$("#myselect option:contains('YourTextHere')").val();

retornará o valor da primeira opção que contém sua descrição de texto. Testei isso e funciona.

Russ Cam
fonte
Obrigado - acho que essa pode ser a versão que eu uso, pois também preciso ter lógica para quando não houver texto correspondente, e esse parece ser o mecanismo mais fácil para conseguir fazer isso.
DanSingerman
1
tenha em mente, ele obterá apenas o valor da primeira opção correspondente ao texto.
Russ Cam
Além disso, você pode encadear attr ("selected", "selected") ao conjunto embrulhado em vez de val (), e isso funcionaria de maneira semelhante à resposta de CarolinaJay65
Russ Cam
1
O OP disse que " definindo valor" não " obtendo valor"
RousseauAlexandre
15

Para evitar todas as complicações da versão do jQuery, recomendo sinceramente o uso de uma dessas funções 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
fonte
Permite a seleção de uma opção de seleção via valor ou texto (dependendo da função chamada). Por exemplo: setSelectByValue ('sausages', '2'); Encontrará e selecionará a opção com o valor "2" no objeto de seleção com um ID de "salsichas".
Dave
2
@ Neal Uh ... responde à pergunta?
Mark # Amery #
10

Sei que este é um post antigo, mas não consegui selecioná-lo por texto usando o jQuery 1.10.3 e as soluções acima. Acabei usando o seguinte código (variação da solução de spoulson):

      var textToSelect = "Hello World";

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

Espero que ajude alguém.

Losbear
fonte
10

Esta linha funcionou:

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

A instrução if faz uma correspondência exata com "dois" e "dois três" não será correspondida

aWebDeveloper
fonte
Não, não foi isso que eu quis dizer. Acho que meu comentário não foi muito claro, então apenas o apaguei. Eu votei sua resposta no entanto, porque funcionou para a minha situação.
Jagd
6

A maneira mais fácil com 1.7+ é:

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

1.9+

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

Testado e funciona.

RParker
fonte
1
Não na versão 1.9+, não. Desde a versão 1.6, você deve usar .proppara alterar as propriedades do DOM, não .attr(que é para atributos HTML / DOM). Veja stackoverflow.com/q/5874652/1709587
Mark Amery
Eu usaria ("selected", true) em vez do valor verdadeiro de "selected"
mplungjan
5

Aqui está uma maneira muito simples. plz usá-lo

$("#free").val("y").change();
Pankaj Chauhan
fonte
4

dê uma olhada no plugin jquery selectedbox

selectOptions(value[, clear]): 

Selecione opções por valor, usando uma sequência como parâmetro $("#myselect2").selectOptions("Value 1");ou uma expressão regular $("#myselect2").selectOptions(/^val/i);.

Você também pode limpar as opções já selecionadas: $("#myselect2").selectOptions("Value 2", true);

Vitor Silva
fonte
3

Apenas em uma nota lateral. Meu valor selecionado não estava sendo definido. E eu tinha pesquisado por toda a rede. Na verdade, tive que selecionar um valor após uma chamada de retorno de um serviço da web, porque estava obtendo dados dele.

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

Portanto, a atualização do seletor foi a única coisa que estava faltando.

Ammar Bukhari
fonte
Este é o caminho certo - apesar de ... não vejo razão para a segunda linha. Deve funcionar como está.
SEO Sagive
2

Eu descobri que usando attr você, você terminaria com várias opções selecionadas quando não quisesse - a solução é usar prop:

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

Chris Edwards
fonte
1

Eu tive um problema com os exemplos acima, e o problema foi causado pelo fato de meus valores da caixa de seleção serem pré-preenchidos com cadeias de comprimento fixo de 6 caracteres, mas o parâmetro transmitido não era de comprimento fixo.

Eu tenho uma função rpad que irá preencher uma string com o tamanho especificado e com o caractere especificado. Então, depois de preencher o parâmetro, ele funciona.

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


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 
Keith
fonte
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
fonte
0

Essa resposta aceita não parece correta, enquanto .val ('newValue') está correto para a função, tentar recuperar uma seleção por seu nome não funciona para mim, tive que usar o id e o nome da classe para obter meu elemento

Sam Alexander
fonte
0

Heres uma opção fácil. Apenas defina sua opção de lista e defina seu texto como valor selecionado:

$("#ddlScheduleFrequency option").selected(text("Select One..."));
DominionDave
fonte
-1

Pegue os filhos da caixa de seleção; loop através deles; quando você encontrar o que deseja, defina-o como a opção selecionada; retorne false para parar o loop.

geowa4
fonte