html - Hur sätter jag programmatiskt värdet på ett select-box-element med JavaScript?
Jag har följande HTML <select>-element:
<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>
Med en JavaScript-funktion med leaveCode-numret som parameter, hur väljer jag det lämpliga alternativet i listan?
Svar #1
Du kan använda den här funktionen:
function selectElement(id, valueToSelect) {
let element = document.getElementById(id);
element.value = valueToSelect;
}
selectElement('leaveCode', '11');<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>Om du vill utlösa onchange-händelsen också, kan du valfritt använda:
element.dispatchEvent(new Event('change'))
Svar #2
Om du använder jQuery kan du också göra så här:
$('#leaveCode').val('14');
Detta kommer att välja <option> med värdet 14.
Med vanlig Javascript kan detta också uppnås med två Document-metoder:
Med
document.querySelectorkan du välja ett element baserat på en CSS-väljare:document.querySelector('#leaveCode').value = '14'Genom att använda det mer etablerade tillvägagångssättet med
document.getElementById(), kommer det, som funktionen antyder, att låta dig välja ett element baserat på dessid:document.getElementById('leaveCode').value = '14'
Du kan köra koden nedan för att se dessa metoder och jQuery-funktionen i aktion:
const jQueryFunction = () => {
$('#leaveCode').val('14');
}
const querySelectorFunction = () => {
document.querySelector('#leaveCode').value = '14'
}
const getElementByIdFunction = () => {
document.getElementById('leaveCode').value='14'
}input {
display:block;
margin: 10px;
padding: 10px
}<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>
<input type="button" value="$('#leaveCode').val('14');" onclick="jQueryFunction()" />
<input type="button" value="document.querySelector('#leaveCode').value = '14'" onclick="querySelectorFunction()" />
<input type="button" value="document.getElementById('leaveCode').value = '14'" onclick="getElementByIdFunction()" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>Svar #3
function setSelectValue (id, val) {
document.getElementById(id).value = val;
}
setSelectValue('leaveCode', 14);
Svar #4
Svarar inte på frågan, men du kan också välja efter index, där i är indexet för objektet du vill välja:
var formObj = document.getElementById('myForm');
formObj.leaveCode[i].selected = true;
Du kan också iterera genom objekten för att välja efter visningsvärde med en loop:
for (var i = 0, len < formObj.leaveCode.length; i < len; i++)
if (formObj.leaveCode[i].value == 'xxx') formObj.leaveCode[i].selected = true;
Svar #5
Kort
Detta är storleksförbättring av Williams svar
leaveCode.value = '14';
leaveCode.value = '14';<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>Svar #6
Jag jämförde de olika metoderna:
Jämförelse av de olika sätten att sätta ett värde på en select med JS eller jQuery
kod :
$(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);
});
Utdata på ett urval med ~4000 element:
- 1 ms
- 58 ms
- 612 ms
Med Firefox 10. Obs: Den enda anledningen till att jag gjorde detta test var för att jQuery presterade mycket dåligt på vår lista med ~2000 poster (de hade längre texter mellan alternativen). Vi hade ungefär 2 s fördröjning efter en val()
Notera också: Jag anger värdet beroende på det verkliga värdet, inte textvärdet.
Svar #7
Jag försökte de ovanstående JavaScript/jQuery-baserade lösningarna, såsom:
$("#leaveCode").val("14");
och
var leaveCode = document.querySelector('#leaveCode');
leaveCode[i].selected = true;
i en AngularJS-app, där det fanns ett obligatoriskt <select>-element.
Ingen av dem fungerar, eftersom AngularJS-formulärvalideringen inte aktiveras. Även om rätt alternativ valdes (och visas i formuläret), förblev inmatningen ogiltig (ng-pristine och ng-invalid klasser är fortfarande närvarande).
För att tvinga AngularJS-valideringen, kalla på jQuery change() efter att ha valt ett alternativ:
$("#leaveCode").val("14").change();
och
var leaveCode = document.querySelector('#leaveCode');
leaveCode[i].selected = true;
$(leaveCode).change();
Svar #8
document.getElementById('leaveCode').value = '10';
Det borde sätta markeringen på "Årlig ledighet"
