Alterando a opção selecionada de um elemento Selecionar HTML

148

No meu HTML, eu tenho um <select>com três <option>elementos. Eu quero usar o jQuery para verificar o valor de cada opção em um Javascript var. Se um corresponder, desejo definir o atributo selecionado dessa opção. Como eu faria isso?

llihttocs
fonte
Publique seu HTML. Mas da maneira usual:$('#myselectid').val()
Samich 10/09/11
9
Sem saber por que ele foi votado, ele é um novo usuário e a pergunta parece legítima.
vol7ron

Respostas:

323

JavaScript de baunilha

Usando JavaScript antigo simples:

var val = "Fish";
var sel = document.getElementById('sel');
document.getElementById('btn').onclick = function() {
  var opts = sel.options;
  for (var opt, j = 0; opt = opts[j]; j++) {
    if (opt.value == val) {
      sel.selectedIndex = j;
      break;
    }
  }
}
<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<button id="btn">Select Fish</button>

jQuery

Mas se você realmente deseja usar o jQuery:

var val = 'Fish';
$('#btn').on('click', function() {
  $('#sel').val(val);
});

jQuery - Usando atributos de valor

Caso suas opções tenham atributos de valor que diferem do conteúdo de texto e você deseje selecionar via conteúdo de texto:

<select id="sel">
    <option value="1">Cat</option>
    <option value="2">Dog</option>
    <option value="3">Fish</option>
</select>
<script>
    var val = 'Fish';
    $('#sel option:contains(' + val + ')').prop({selected: true});
</script>

Demo

Mas se você tiver configurado acima e desejar selecionar por valor usando o jQuery, poderá fazer o seguinte:

var val = 3;
$('#sel').val(val);

DOM moderno

Para os navegadores que suportam document.querySelectore a HTMLOptionElement::selectedpropriedade, esta é uma maneira mais sucinta de realizar esta tarefa:

var val = 3;    
document.querySelector('#sel [value="' + val + '"]').selected = true;

Demo

Knockout.js

<select data-bind="value: val">
    <option value="1">Cat</option>
    <option value="2">Dog</option>
    <option value="3">Fish</option>
</select>
<script>
    var viewModel = {
        val: ko.observable()
    };
    ko.applyBindings(viewModel);
    viewModel.val(3);
</script>

Demo

Polímero

<template id="template" is="dom-bind">
    <select value="{{ val }}">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</template>
<script>
    template.val = 3;
</script>

Demo

Angular 2

Nota: isso não foi atualizado para a versão estável final.

<app id="app">
    <select [value]="val">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</app>
<script>
    var App = ng.Component({selector: 'app'})
        .View({template: app.innerHTML})
        .Class({constructor:  function() {}});

    ng.bootstrap(App).then(function(app) {
        app._hostComponent.instance.val = 3;
    });
</script>

Demo

Vue 2

<div id="app">
    <select v-model="val">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
                val: null,
        },
        mounted: function() {
                this.val = 3;
        }
    });
</script>

Demo

kzh
fonte
1
Isso foi especialmente útil porque não tinha certeza de como definir o atributo selecionado. Não sabia que havia um índice selecionado. Obrigado.
Lllhttocs
1
@aelgoa jsperf.com/option-select-loop/2 Corrigi seu primeiro snippet para imitar mais meu código, o que torna o meu mais lento. Usei pós-incremento em vez de pré-incremento e, em seguida, adicionei outro teste que é um pouco mais rápido que o seu terceiro teste.
kzh
1
para os sádicos:document.evaluate(".//select[@id='sel']/option[text()='Fish']", document.body, null, 9, null).singleNodeValue.selected = true;
kzh
1
@llihttocs E agora?
kzh
1
Obrigado por incluir javascript baunilha - para aqueles de nós que gostam de código para nós :)
Peter Cullen
24

Nenhum dos exemplos usando jquery aqui está realmente correto, pois deixará o select exibindo a primeira entrada, mesmo que o valor tenha sido alterado.

A maneira correta de selecionar o Alasca e fazer com que o select mostre o item certo conforme selecionado usando:

<select id="state">
    <option value="AL">Alabama</option>
    <option value="AK">Alaska</option>
    <option value="AZ">Arizona</option>
</select>

Com jquery seria:

$('#state').val('AK').change();
Justin Buser
fonte
19

Você pode alterar o valor do elemento select, que altera a opção selecionada para aquela com esse valor, usando JavaScript:

document.getElementById('sel').value = 'bike';​​​​​​​​​​

DEMO

Ivin Raj
fonte
1
Seu exemplo não funciona por causa do tempo. Atualizei-o para aguardar até o usuário clicar em um botão: jsfiddle.net/xkqTR/3271
dlaliberte
isso não aciona o evento de alteração no elemento selecionado. você tem solução nisso?
DragonKnight 21/02/19
10

Marcação

<select id="my_select">
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
</select>

jQuery

var my_value = 2;
$('#my_select option').each(function(){
    var $this = $(this); // cache this jQuery object to avoid overhead

    if ($this.val() == my_value) { // if this option's value is equal to our value
        $this.prop('selected', true); // select this option
        return false; // break the loop, no need to look further
    }
});

Demo

Shef
fonte
Eu acho que isso é exatamente o que eu precisava. Eu já usei várias linhas do seu código e parece funcionar. Obrigado pelos ótimos trechos.
Lllhttocs
@llihttocs: Ainda bem que ajudei. Sinta-se à vontade para aceitar a resposta que resolve seu problema clicando no visto vazio abaixo da contagem de votos no lado superior esquerdo da resposta. Para que esta pergunta seja marcada como resolvida e outras pessoas que procurarem a mesma solução, encontrarão a resposta facilmente.
Shef
4

Desejo alterar o valor da opção selecionada e o conteúdo do texto (o que vemos) para 'Manga'.

O código mais simples que funcionou está abaixo:

var newValue1 = 'Mango'

var selectElement = document.getElementById('myselectid');
selectElement.options[selectElement.selectedIndex].value = newValue1;
selectElement.options[selectElement.selectedIndex].textContent = newValue1;

Espero que ajude alguém. Boa sorte.
Voto se isso te ajudou.

Manohar Reddy Poreddy
fonte
2

Teste esta demonstração

  1. Selecionando Opção com base em seu valor

    var vals = [2,'c'];
    
    $('option').each(function(){
       var $t = $(this);
    
       for (var n=vals.length; n--; )
          if ($t.val() == vals[n]){
             $t.prop('selected', true);
             return;
          }
    });
  2. Selecionando Opção com base em seu texto

    var vals = ['Two','CCC'];                   // what we're looking for is different
    
    $('option').each(function(){
       var $t = $(this);
    
       for (var n=vals.length; n--; )
          if ($t.text() == vals[n]){            // method used is different
             $t.prop('selected', true);
             return;
          }
    });

HTML de suporte

<select>
   <option value=""></option>
   <option value="1">One</option>
   <option value="2">Two</option>
   <option value="3">Three</option>
</select>

<select>
   <option value=""></option>
   <option value="a">AAA</option>
   <option value="b">BBB</option>
   <option value="c">CCC</option>
</select>
vol7ron
fonte
1
Este exemplo é muito útil. Eu não tinha certeza de como percorrer as opções e definir o atributo selecionado. Obrigado por uma resposta tão completa.
Lllhttocs
Sem problemas llihttocs, clique na seta para cima ao lado de perguntas / comentários que achar úteis. E selecione a marca de seleção ao lado da resposta que você escolher. - você pode fazer um w / o que lhe custar nada
vol7ron
1

Excelentes respostas - aqui está a versão D3 para quem procura:

<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<script>
    d3.select('#sel').property('value', 'Fish');
</script>
Tristan Reid
fonte
1

Eu usei quase todas as respostas postadas aqui, mas não me sinto à vontade com isso, então eu passo um passo adiante e encontrei uma solução fácil que se adapta às minhas necessidades e que vale a pena compartilhar com vocês.
Em vez de iteração em todas as opções ou usando o JQuery, você pode usar o JS principal em etapas simples:

Exemplo

<select id="org_list">
  <option value="23">IBM</option>
  <option value="33">DELL</option>
  <option value="25">SONY</option>
  <option value="29">HP</option>
</select>

Portanto, você deve saber o valor da opção a ser selecionada.

function selectOrganization(id){
    org_list=document.getElementById('org_list');
    org_list.selectedIndex=org_list.querySelector('option[value="'+id+'"]').index;
}

Como usar?

selectOrganization(25); //this will select SONY from option List

Seus comentários são bem-vindos. :) AzmatHunzai.

Azmat Karim Khan
fonte
1

Depois de muita pesquisa, tentei @kzh na lista de seleção, onde apenas optiono texto interno não é valueatribuído, este código com base na resposta selecionada, usei-o para alterar a opção de seleção de acordo com a página atual urlneste formato http://www.example.com/index.php?u=Steve

<select id="sel">
    <option>Joe</option>
    <option>Steve</option>
    <option>Jack</option>
</select>
<script>
    var val = window.location.href.split('u=')[1]; // to filter ?u= query 
    var sel = document.getElementById('sel');
    var opts = sel.options;
    for(var opt, j = 0; opt = opts[j]; j++) {
        // search are based on text inside option Attr
        if(opt.text == val) {
            sel.selectedIndex = j;
            break;
        }
    }
</script>

Isso mantém os urlparâmetros mostrados como selecionados para torná-lo mais amigável e o visitante sabe qual página ou perfil está visualizando no momento.

Salem
fonte
0

Eu usei isso depois de atualizar um registro e alterei o estado da solicitação via ajax, depois fiz uma consulta com o novo estado no mesmo script e o coloquei no elemento de marca de seleção new state para atualizar a exibição.

var objSel = document.getElementById("selectObj");
objSel.selectedIndex = elementSelected;

Espero que isso seja útil.

user7071893
fonte
-1

Versão Vanilla.JS ligeiramente mais limpa. Supondo que você já tenha corrigido a nodeListfalta .forEach():

NodeList.prototype.forEach = Array.prototype.forEach

Somente:

var requiredValue = 'i-50332a31',   
  selectBox = document.querySelector('select')

selectBox.childNodes.forEach(function(element, index){
  if ( element.value === requiredValue ) {
    selectBox.selectedIndex = index
  }
})
mikemaccana
fonte