Come posso impostare a livello di codice il valore di un elemento box di selezione usando JavaScript?


421

Ho il seguente <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>

Utilizzando una funzione JavaScript con il leaveCodenumero come parametro, come faccio a selezionare l'opzione appropriata nell'elenco?


vedere la mia risposta per un confronto delle prestazioni per diversi metodi
Toskan,

Risposte:


532

Puoi usare questa funzione:

selectElement('leaveCode', '11')

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

4
Ottima risposta, questo è molto più semplice che scorrere le opzioni. Ed è conforme agli standard: dev.w3.org/html5/spec/… . Se ci sono incompatibilità del browser (ovviamente ce ne sono :) Sarei molto interessato a sapere cosa sono. Questo è il genere di cose per cui di solito conti su PPK, ma lui rifiuta ostinatamente di mostrarsi nelle mie ricerche per questo argomento.
philo,

9
E le selezioni multiple? Questo non sembra funzionare in caso di più opzioni (almeno in Chrome 25).
Georgii Ivankin,

2
Come ha sottolineato @ ring0, quando valueToSelect non esiste, inserisce una voce vuota in chrome. mentre IE e firefox mantengono l'ultimo valore selezionato.
Karthik Bose,

1
Nota per IE: l '<opzione> deve avere un attributo value =' valueToSelect '. Non è possibile utilizzare il testo di visualizzazione all'interno di <opzione> .. </option> come valore Selezionare Seleziona
Peter Quiring,

4
Se hai bisogno di lanciare l'evento di cambiamento, dovresti anche: element.dispatchEvent(new Event('change'));
Patrick James McDougle

120

Se stai usando jQuery puoi anche farlo:

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

Questo selezionerà il <option>con il valore di 14.


Con Javascript semplice, questo può essere ottenuto anche con due Documentmetodi :

  • Con document.querySelector, puoi selezionare un elemento basato su un selettore CSS:

    document.querySelector('#leaveCode').value = '14'
  • Utilizzando l'approccio più consolidato con document.getElementById(), che, come suggerisce il nome della funzione, consente di selezionare un elemento in base al suo id:

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

È possibile eseguire il codice riportato di seguito per visualizzare questi metodi e la funzione jQuery in azione:


4
Questo può essere utilizzato anche per la selezione multipla; basta passare un array di stringhe alla funzione 'val' invece di una singola stringa. Vedi: stackoverflow.com/a/16583001/88409
Triynko

C'è un modo per innescare anche $ ('# leaveCode'). On ('change', function () in questo modo?
Lieuwe

5
$ ( "# leaveCode") val ( "14") il cambiamento ()..;
Loren,

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

16

Non rispondere alla domanda, ma puoi anche selezionare per indice, dove i è l'indice dell'articolo che desideri selezionare:

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

Puoi anche scorrere gli elementi per selezionare in base al valore di visualizzazione con un ciclo:

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

4
Non dovrebbe formObj.leaveCode [i] .selected = true; be formObj.options [i] .selected = true; ?
David Christopher Reynolds,

14

Ho confrontato i diversi metodi:

Confronto tra i diversi modi su come impostare un valore di una selezione con JS o jQuery

codice:

$(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);
});

Uscita su una selezione con ~ 4000 elementi:

  • 1 ms
  • 58 ms
  • 612 ms

Con Firefox 10. Nota: L'unico motivo per cui ho fatto questo test è stato perché jQuery si è comportato in modo super scadente nella nostra lista con ~ 2000 voci (avevano testi più lunghi tra le opzioni). Abbiamo avuto un ritardo di circa 2 secondi dopo un val ()

Nota anche: sto impostando il valore in base al valore reale, non al valore del testo.


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

Ciò dovrebbe impostare la selezione su "Congedo annuale"


9

Ho provato le precedenti soluzioni basate su JavaScript / jQuery, come ad esempio:

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

e

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

in un'app AngularJS, in cui era richiesto un elemento <select>.

Nessuno di questi funziona perché la convalida del modulo AngularJS non viene attivata. Sebbene sia stata selezionata l'opzione giusta (ed è visualizzata nel modulo), l'input è rimasto non valido ( sono ancora presenti le classi ng-pristine e ng-invalid ).

Per forzare la convalida di AngularJS, chiama jQuery change () dopo aver selezionato un'opzione:

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

e

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

Perché usare jQuery per questo quando puoi già farlo con Angular? Quando usi Angular stesso, non hai la possibilità di impostare il valore, con il supporto integrato per innescare la modifica (Non ho idea, io uso React, ho appena trovato questo post dopo un google di 5 secondi: stackoverflow.com/questions/ 50302062 /… )? Perché ciò significherebbe che non devi hackerare Angular con una libreria aggiuntiva di ± 30kb "solo per questo" :)
SidOfc

3

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


3

Il modo più semplice se è necessario:
1) Fare clic su un pulsante che definisce l'opzione di selezione
2) Andare in un'altra pagina, dove l'opzione di selezione è
3) Far selezionare quel valore di opzione su un'altra pagina

1) i collegamenti dei pulsanti (ad esempio, nella home page)

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

(dove contact.php è la tua pagina con opzioni selezionate. Nota l'URL della pagina ha? opzione = 1 o 2)

2) metti questo codice sulla tua seconda pagina (il mio caso contact.php )

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

3) rendere selezionato il valore dell'opzione, a seconda del pulsante selezionato

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

.. e così via.
Quindi questo è un modo semplice per passare il valore a un'altra pagina (con un elenco di opzioni selezionate) tramite GET in url. Nessun modulo, nessun ID .. solo 3 passaggi e funziona perfettamente.


1

Perché non aggiungere una variabile per l'ID dell'elemento e renderla una funzione riutilizzabile?

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

1

Supponiamo che il tuo modulo sia chiamato 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

Dovrebbe essere qualcosa del genere:

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 usi PHP potresti provare qualcosa del genere:

$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

Molto probabilmente lo desideri:

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

O

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

8
Ciò presuppone però che OP utilizzi JQuery
Barry Michael Doyle il

2
@BarryMichaelDoyle, che non lo è, perché anche il titolo delle domande termina using JavaScript.
Iulian Onofrei il

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

3
Quando aggiungi una risposta a una domanda di undici anni con sedici risposte esistenti, è molto importante sottolineare quale nuovo aspetto della domanda affronta la tua risposta. Se non lo fai e la tua modifica è impercettibile, la tua risposta potrebbe essere mancata e la tua risposta rimossa come duplicato in ritardo. Le risposte solo al codice possono quasi sempre essere migliorate aggiungendo alcune spiegazioni su come e perché funzionano.
Jason Aller il

-6

Temo di non essere in grado di testarlo al momento, ma in passato credo di dover assegnare un ID a ciascun tag opzione, quindi ho fatto qualcosa del tipo:

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

Se non funziona, forse ti avvicina a una soluzione: P


3
Il HTMLOptionElement non dispone di un select()metodo (non definisce alcun metodo aggiuntivi oltre il set standard su tutti gli elementi HTML). Tuttavia, è possibile impostare la selectedproprietà su true.
Mr White,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.