Como definir programaticamente o valor de um elemento da caixa de seleção usando JavaScript?


421

Eu tenho o seguinte <select>elemento HTML :

<select id="leaveCode" name="leaveCode">
  <option value="10">Annual Leave</option>
  <option value="11">Medical Leave</option>
  <option value="14">Long Service</option>
  <option value="17">Leave Without Pay</option>
</select>

Usando uma função JavaScript com o leaveCode número como parâmetro, como faço para selecionar a opção apropriada na lista?


veja a minha resposta para uma comparação de desempenho para diferentes métodos
Toskan

Respostas:


532

Você pode usar esta função:

selectElement('leaveCode', '11')

function selectElement(id, valueToSelect) {    
    let element = document.getElementById(id);
    element.value = valueToSelect;
}

4
Ótima resposta, isso é muito mais fácil do que percorrer as opções. E é compatível com os padrões: dev.w3.org/html5/spec/… . Se houver incompatibilidades no navegador (é claro que existem :), eu ficaria muito interessado em saber o que são. Esse é o tipo de coisa com que você costuma contar com o ppk, mas ele teimosamente se recusa a aparecer nas minhas pesquisas por esse tópico.
Philo

9
E o que dizer de várias seleções? Parece não funcionar no caso de várias opções (pelo menos no Chrome 25).
Georgii Ivankin

2
Como @ ring0 apontou, quando valueToSelect não existe, ele insere uma entrada em branco no chrome. enquanto o IE e o firefox retêm o último valor selecionado.
precisa

1
Nota para o IE: a <opção> deve ter um atributo value = 'valueToSelect'. Você não pode usar o texto de exibição dentro do <option> .. </ option> como um valueToSelect
Peter Quiring

4
Se você precisar que o evento de mudança seja acionado, faça também: element.dispatchEvent(new Event('change'));
Patrick James McDougle

120

Se você estiver usando o jQuery, também poderá fazer o seguinte:

$('#leaveCode').val('14');

Isso selecionará <option>o valor 14.


Com Javascript simples, isso também pode ser alcançado com dois Documentmétodos :

  • Com document.querySelector, você pode selecionar um elemento com base em um seletor de CSS:

    document.querySelector('#leaveCode').value = '14'
  • Usando a abordagem mais estabelecida com document.getElementById(), que, como o nome da função implica, permite selecionar um elemento com base em id:

    document.getElementById('leaveCode').value = '14'

Você pode executar o código abaixo capturado para ver esses métodos e a função jQuery em ação:


4
Isso também pode ser usado para seleção múltipla; basta passar uma matriz de strings para a função 'val' em vez de uma única string. Veja: stackoverflow.com/a/16583001/88409
Triynko

Existe uma maneira de também desencadear $ ( '# leaveCode') em ( 'mudança', function () fazendo isso.?
Lieuwe

5
$ ("# leaveCode"). val ("14"). change ();
Loren

29
function setSelectValue (id, val) {
    document.getElementById(id).value = val;
}
setSelectValue('leaveCode', 14);

16

Não respondendo à pergunta, mas você também pode selecionar por índice, onde i é o índice do item que você deseja selecionar:

var formObj = document.getElementById('myForm');
formObj.leaveCode[i].selected = true;

Você também pode percorrer os itens a serem selecionados pelo valor de exibição com um loop:

for (var i = 0, len < formObj.leaveCode.length; i < len; i++) 
    if (formObj.leaveCode[i].value == 'xxx') formObj.leaveCode[i].selected = true;

4
Não deve formObj.leaveCode [i] .selected = true; ser formObj.options [i] .selected = true; ?
David Christopher Reynolds

14

Eu comparei os diferentes métodos:

Comparação das diferentes maneiras de definir um valor de um select com JS ou jQuery

código:

$(function() {
    var oldT = new Date().getTime();
     var element = document.getElementById('myId');
    element.value = 4;
    console.error(new Date().getTime() - oldT);

    oldT = new Date().getTime();
    $("#myId option").filter(function() {
        return $(this).attr('value') == 4;
    }).attr('selected', true);
    console.error(new Date().getTime() - oldT);

    oldT = new Date().getTime();
    $("#myId").val("4");
    console.error(new Date().getTime() - oldT);
});

Saída em uma seleção com ~ 4000 elementos:

  • 1 ms
  • 58 ms
  • 612 ms

Com o Firefox 10. Nota: O único motivo pelo qual fiz esse teste foi porque o jQuery teve um desempenho muito ruim em nossa lista com ~ 2000 entradas (eles tinham textos mais longos entre as opções). Tivemos um atraso de aproximadamente 2 s após um val ()

Observe também: estou definindo um valor dependendo do valor real, não do valor do texto.


10
document.getElementById('leaveCode').value = '10';

Isso deve definir a seleção para "Férias anuais"


9

Tentei as soluções baseadas em JavaScript / jQuery acima, como:

$("#leaveCode").val("14");

e

var leaveCode = document.querySelector('#leaveCode');
leaveCode[i].selected = true;

em um aplicativo AngularJS, onde havia um requisito elemento <select> .

Nenhum deles funciona, porque a validação do formulário AngularJS não é acionada. Embora a opção correta tenha sido selecionada (e seja exibida no formulário), a entrada permaneceu inválida ( ng-pristine e ng-invalid classes ainda estão presentes).

Para forçar a validação do AngularJS, chame jQuery change () depois de selecionar uma opção:

$("#leaveCode").val("14").change();

e

var leaveCode = document.querySelector('#leaveCode');
leaveCode[i].selected = true;
$(leaveCode).change();

Por que usar o jQuery para isso quando você já pode fazê-lo com o Angular? Ao usar o Angular em si, você não tem a capacidade de definir o valor, com suporte interno para acionar a alteração (Não faço ideia, eu uso o React, apenas encontrei esta postagem após 5 segundos no google: stackoverflow.com/questions/ 50302062 /… )? Porque isso significa que você não tem que cortar em torno angular com um ± biblioteca 30kb adicional "apenas para este" :)
SidOfc

3

function foo(value)
{
    var e = document.getElementById('leaveCode');
    if(e) e.value = value;
}


3

A maneira mais fácil se você precisar:
1) Clique em um botão que define a opção de seleção
2) Vá para outra página, onde a opção de seleção é
3) Tenha esse valor de opção selecionado em outra página

1) links de seu botão (por exemplo, na página inicial)

<a onclick="location.href='contact.php?option=1';" style="cursor:pointer;">Sales</a>
<a onclick="location.href='contact.php?option=2';" style="cursor:pointer;">IT</a>

(onde contact.php é sua página com opções selecionadas. Observe que o URL da página possui? option = 1 ou 2)

2) coloque esse código em sua segunda página (meu caso contact.php )

<?
if (isset($_GET['option']) && $_GET['option'] != "") {
$pg = $_GET['option'];              
} ?>

3) selecione o valor da opção, dependendo do botão clicado

<select>
<option value="Sales" <? if ($pg == '1') { echo "selected"; } ?> >Sales</option>
<option value="IT" <? if ($pg == '2') { echo "selected"; } ?> >IT</option>
</select>

.. e assim por diante.
Portanto, é uma maneira fácil de passar o valor para outra página (com lista de opções de seleção) por meio de GET em url. Sem formulários, sem IDs .. apenas 3 etapas e funciona perfeitamente.


1

Por que não adicionar uma variável ao ID do elemento e torná-lo uma função reutilizável?

function SelectElement(selectElementId, valueToSelect)
{    
    var element = document.getElementById(selectElementId);
    element.value = valueToSelect;
}

1

Suponha que seu formulário seja nomeado form1 :

function selectValue(val)
{
  var lc = document.form1.leaveCode;
  for (i=0; i&lt;lc.length; i++)
  {
    if (lc.options[i].value == val)
    {
        lc.selectedIndex = i;
        return;
    }
  }
}

1

Deve ser algo nesse sentido:

function setValue(inVal){
var dl = document.getElementById('leaveCode');
var el =0;
for (var i=0; i<dl.options.length; i++){
  if (dl.options[i].value == inVal){
    el=i;
    break;
  }
}
dl.selectedIndex = el;
}

-1

Se você usa PHP, pode tentar algo como isto:

$value = '11';
$first = '';
$second = '';
$third = '';
$fourth = '';

switch($value) {
            case '10' :
                $first = 'selected';
            break;
            case '11' :
                $second = 'selected';
            break;
            case '14' :
                $third = 'selected';
            break;
            case '17' :
                $fourth = 'selected';
            break;
        }

echo'
<select id="leaveCode" name="leaveCode">
  <option value="10" '. $first .'>Annual Leave</option>
  <option value="11" '. $second .'>Medical Leave</option>
  <option value="14" '. $third .'>Long Service</option>
  <option value="17" '. $fourth .'>Leave Without Pay</option>
</select>';

-1

Você provavelmente quer isso:

$("._statusDDL").val('2');

OU

$('select').prop('selectedIndex', 3); 

8
Isso supõe que o OP está usando JQuery embora
Barry Michael Doyle

2
@BarryMichaelDoyle, o que não é, porque até o título das perguntas termina com using JavaScript.
Iulian Onofrei

-1
function selecetElement() {
 var selectedValue = document.getElementById('leaveCode');
 selectedValue.value = "11";
}

3
Ao adicionar uma resposta a uma pergunta de onze anos com dezesseis respostas existentes, é muito importante destacar o novo aspecto da pergunta que sua resposta aborda. Se você não fizer isso e sua alteração for sutil, poderá ser perdida e sua resposta removida como duplicada tardia. As respostas somente de código quase sempre podem ser aprimoradas, adicionando algumas explicações sobre como e por que elas funcionam.
Jason Aller

-6

Receio não poder testar isso no momento, mas, no passado, acredito que tive que atribuir um ID a cada tag de opção e, em seguida, fiz algo como:

document.getElementById("optionID").select();

Se isso não funcionar, talvez você esteja mais perto de uma solução: P


3
O HTMLOptionElement não possui um select()método (ele não define nenhum método adicional sobre o conjunto padrão em todos os elementos HTML). No entanto, você pode definir a selectedpropriedade como true.
MrWhite
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.