Como você seleciona uma opção específica em um elemento SELECT no jQuery?

718

Se você conhece o Índice, Valor ou Texto. Além disso, se você não tiver um ID para uma referência direta.

Isso , isso e isso são respostas úteis.

Exemplo de marcação

<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>
Jay Corbett
fonte
46
$("#my_select").val("the_new_value").change();... de so
dsdsdsdsd 26/09/14

Respostas:

1206

Um seletor para obter o elemento de opção do meio por valor é

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

Para um índice:

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

Para um texto conhecido:

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

EDIT : Como comentado acima, o OP pode ter sido depois de alterar o item selecionado do menu suspenso. Na versão 1.6 e superior, o método prop () é recomendado:

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

Nas versões mais antigas:

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

EDIT2 : após o comentário de Ryan. Uma correspondência na "Seleção 10" pode ser indesejada. Não encontrei nenhum seletor para corresponder ao texto completo, mas um filtro funciona:

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

EDIT3 : Tenha cuidado, $(e).text()pois ele pode conter uma nova linha fazendo com que a comparação falhe. Isso acontece quando as opções são implicitamente fechadas (sem </option>tag):

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

Se você simplesmente usar e.textqualquer espaço em branco extra, como a nova linha à direita, será removida, tornando a comparação mais robusta.

Grastveit
fonte
8
: contém não é ótimo, pois corresponderá a pedaços de texto; problemático se algum texto da sua opção for uma substring de outro texto da opção.
Ryan
26
Isso também funciona $ ('# id option [value = "0"]'). Attr ('selected', 'selected');
DevC
@Grastveit como alterar a cor da primeira opção, se for selecionada ou não quando houver uma classe, como myClass. Obrigado
Zaker 5/05
@ Usuário não entendo. Talvez postá-lo em uma nova pergunta? Ou é $ ('. SelDiv .myClass'). Css ('color', 'red')?
Grastveit
6
Eu gostaria de adicionar você DEFINITIVAMENTE deve usar prop e não attr. Eu quase enlouqueci ao tentar depurar um aplicativo e mudar de attr para prop corrigi-lo.
user609926
125

Nenhum dos métodos acima forneceu a solução que eu precisava, então achei que forneceria o que funcionava para mim.

$('#element option[value="no"]').attr("selected", "selected");
user1074546
fonte
10
Observe que no jQuery 1.6 isso deve ser usado prope não attr.
Gone Coding
@GoneCoding Using .attrestá correto. "selected" é um atributo da <opção> w3.org/TR/html5/forms.html#attr-option-selected
Carlos Llongo
3
@CarlosLlongo: Isso é irrelevante. A recomendação do jQuery é sempre usar propem preferência a attr. Isso economiza a necessidade de procurar todas as propriedades no w3.org para ver se é apenas um atributo ou implementado com ações de backup.
Gone Coding
82

Você pode apenas usar o val()método:

$('select').val('the_value');
Leandro Ardissone
fonte
20
Isso está errado porque você está configurando o valor de TODOS os elementos SELECT para the_value. .val não é uma função seletora / filtro! É um acessador de propriedade e, passando-o, essa sequência SETS o valor. Tentei recuperar meu voto positivo, mas era tarde demais depois que percebi isso nos testes.
AaronLS
4
Quente você tem 10 votos como resposta útil? O val () é um getter e um setter. Se você apenas usar val (), receberá o valor. Se você passar algo como val ('the_value'), está configurando-o para 'the_value'
Gui
12
Por favor @AaronLS e @guilhermeGeek, consulte os documentos (último exemplo). Ele funciona como um seletor para caixas de seleção, seleção e botões de opção e como um configurador de valores para entradas e áreas de texto.
Leandro Ardissone
9
Você interpretou mal a documentação. Para caixas de seleção, rádios e caixas de listagem, o comando define o atributo "selecionado" para esses itens. O último exemplo mostra como passar val ("caixa de seleção 1") faz com que seja selecionado. Não é o mesmo que um "seletor" em termos de obter os objetos via seletor CSS / jquery. Testei seu código, ele não funciona.
AaronLS 31/05
27
+1: não, não é um seletor JQuery, no entanto, acho que a maioria das pessoas que pesquisam essa pergunta é como eu e simplesmente deseja alterar a opção atualmente selecionada; criar um seletor real é apenas uma maneira de fazer isso. E isso é certamente melhor do que respostas que eu já vi que você itera sobre todas as opções.
kdgregory
57

Por valor, o que funcionou para mim com o jQuery 1.7 foi o código abaixo, tente o seguinte:

$('#id option[value=theOptionValue]').prop('selected', 'selected').change();
mpoletto
fonte
5
Não sei se você precisa do método .change ().
Phillip Senn
6
O .change()foi necessário. Eu tive um exemplo em que estava alternando miniaturas com base em um SELECT. Quando carreguei um tema personalizado, ele deveria selecionar "Tema personalizado" na lista de opções. A .prop()chamada funcionou, mas sem a .change()imagem em miniatura à direita da minha seleção nunca foi atualizada.
Volomike
2
.change () foi o melhor conselho. 1
Ja8zyjits
1
Nota: um propvalor booleano gera a mesma saída. por exemplo.prop('selected', true)
Gone Coding
Depende, alguns navegadores - talvez navegadores antigos - precisam da string 'selecionada'. Eu acho que a maioria deles suporta a string de texto.
mpoletto
16

Existem várias maneiras de fazer isso, mas a abordagem mais limpa foi perdida entre as principais respostas e muitos argumentos sobre val() . Também alguns métodos foram alterados a partir do jQuery 1.6, portanto, isso precisa de uma atualização.

Para os exemplos a seguir, assumirei que a variável $selecté um objeto jQuery apontando para a <select>tag desejada , por exemplo, através do seguinte:

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

Nota 1 - use val () para correspondências de valores:

Para a correspondência de valores, usar val()é muito mais simples do que usar um seletor de atributos: https://jsfiddle.net/yz7tu49b/6/

$select.val("SEL2");

A versão setter de .val()é implementada em selecttags, configurando a selectedpropriedade de uma correspondência optioncom a mesmavalue , portanto funciona bem em todos os navegadores modernos.

Nota 2 - use prop ('selecionado', verdadeiro):

Se você deseja definir o estado selecionado de uma opção diretamente, pode usar prop(não attr) um booleanparâmetro (em vez do valor do texto selected):

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

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

Nota 3 - permita valores desconhecidos:

Se você usar val()para selecionar um <option>, mas o val não for correspondido (pode ocorrer dependendo da origem dos valores), "nada" será selecionado e $select.val()retornará null.

Portanto, para o exemplo mostrado e por uma questão de robustez, você pode usar algo como este https://jsfiddle.net/1250Ldqn/ :

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

Nota 4 - correspondência exata do texto:

Se você deseja corresponder pelo texto exato, pode usar a filterfunção with. por exemplo, https://jsfiddle.net/yz7tu49b/2/ :

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

embora se você tiver um espaço em branco extra, poderá adicionar um recorte à verificação, como em

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

Nota 5 - correspondência por índice

Se você deseja corresponder por índice, apenas indexe os filhos do select, por exemplo, https://jsfiddle.net/yz7tu49b/3/

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

Embora eu costumo evitar propriedades diretas do DOM em favor do jQuery hoje em dia, para código à prova de futuro, isso também pode ser feito 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 disparar a nova seleção

Em todos os casos acima, o evento de alteração não é acionado. Isso ocorre por design, para que você não termine com eventos de mudança recursivos.

Para gerar o evento de mudança, se necessário, basta adicionar uma chamada ao objeto .change()jQuery select. por exemplo, o primeiro exemplo mais simples se torna https://jsfiddle.net/yz7tu49b/7/

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

Também existem muitas outras maneiras de encontrar os elementos usando seletores de atributos, como [value="SEL2"], mas você deve lembrar que os seletores de atributos são relativamente lentos em comparação com todas essas outras opções.

Gone Coding
fonte
13

Você pode nomear o select e usar isso:

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

Ele deve selecionar a opção desejada.

Sandro
fonte
12
   $(elem).find('option[value="' + value + '"]').attr("selected", "selected");
João Paulo Oliveira
fonte
Obrigado por sua postagem, mas o que essa resposta adiciona à conversa que não está incluída nas respostas aceitas?
Edward
se já houver uma opção selecionada, isso falhará, pois o menu suspenso não pode ter mais de um item selecionado, a menos que seja uma seleção múltipla. Você precisa fazer .prop ( 'selecionados', true)
derekcohen
9

Respondendo minha própria pergunta para documentação. Tenho certeza de que existem outras maneiras de fazer isso, mas isso funciona e esse código é testado.

<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>
Jay Corbett
fonte
9

Exatamente funcionará, tente os métodos abaixo

Para a opção de seleção normal

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

Para selecionar 2 opção opção gatilho precisa usar

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

Usando jquery-2.1.4 , encontrei a seguinte resposta para trabalhar para mim:

$('#MySelectionBox').val(123).change();

Se você tiver um valor de sequência, tente o seguinte:

$('#MySelectionBox').val("extra thing").change();

Outros exemplos não funcionaram para mim, por isso estou adicionando esta resposta.

Encontrei a resposta original em: https://forum.jquery.com/topic/how-to-dynamically-select-option-in-dropdown-menu

raddevus
fonte
8

Para definir o valor selecionado, com o acionamento selecionado:

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

Para definir a opção de um escopo:

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

Esse código usa o seletor para descobrir o objeto de seleção com condição e, em seguida, altere o atributo selecionado por attr().


Além disso, recomendo adicionar um change()evento após definir o atributo para selected, ao fazer isso, o código estará próximo de alterar a seleção por usuário.

Nick Tsai
fonte
6

Eu uso isso, quando eu sei o índice da lista.

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

Isso permite que a lista seja alterada e acione o evento de alteração. O ": nésimo (n)" está contando no índice 0

Miguel
fonte
5

Eu vou com:-

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

Tente isto

você apenas usa o ID do campo de seleção em vez de #id (por exemplo, # select_name)

em vez do valor da opção, use seu valor de opção de seleção

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

Para o Jquery escolhido se você enviar o atributo para funcionar e precisar atualizar a opção de seleção

$('#yourElement option[value="'+yourValue+'"]').attr('selected', 'selected');
$('#editLocationCity').chosen().change();
$('#editLocationCity').trigger('liszt:updated');
Andrej Gaspar
fonte
3
/* This will reset your select box with "-- Please Select --"   */ 
    <script>
    $(document).ready(function() {
        $("#gate option[value='']").prop('selected', true);
    });
    </script>
Pratik Kamani
fonte
1

O $('select').val('the_value');parece a solução certa e se você tem as linhas da tabela de dados, em seguida:

$row.find('#component').val('All');
Jitesh Sojitra
fonte
1

se você não quiser usar o jQuery, poderá usar o código abaixo:

document.getElementById("mySelect").selectedIndex = "2";
FLICKER
fonte
1

Obrigado pela pergunta. Espero que este pedaço de código funcione para você.

var val = $("select.opts:visible option:selected ").val();
Russel Hussain
fonte
0
$('#select option[data-id-estado="3"]').prop("selected",true).trigger("change");

ou

$('#select option[value="myValue"]').prop("selected",true).trigger("change");
Tony Duran
fonte
Edite sua resposta para que o código seja formatado como código. Faça isso usando a barra de ferramentas ou simplesmente recuando todas as linhas de cada bloco de código por quatro espaços.
beruic 9/07/19