ฉันจะตั้งค่าองค์ประกอบของกล่องเลือกโดยใช้โปรแกรมได้อย่างไรโดยใช้ JavaScript?


420

ฉันมี<select>องค์ประกอบ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>

การใช้ฟังก์ชั่น JavaScript ที่มีleaveCodeหมายเลขเป็นพารามิเตอร์ฉันจะเลือกตัวเลือกที่เหมาะสมในรายการได้อย่างไร


ดูคำตอบของฉันสำหรับการเปรียบเทียบประสิทธิภาพสำหรับวิธีการที่แตกต่างกัน
Toskan

คำตอบ:


532

คุณสามารถใช้ฟังก์ชั่นนี้:

selectElement('leaveCode', '11')

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

4
คำตอบที่ดีนี่เป็นวิธีที่ง่ายกว่าการวนซ้ำตัวเลือกต่างๆ และมาตรฐานของมัน compliant: dev.w3.org/html5/spec/... หากมีความเข้ากันไม่ได้ของเบราว์เซอร์ (แน่นอนมี :) ฉันสนใจที่จะรู้ว่าพวกเขาคืออะไร นั่นคือสิ่งที่คุณมักจะเชื่อมั่นใน PPK แต่เขาปฏิเสธที่จะแสดงในการค้นหาของฉันในหัวข้อนี้
philo

9
และมีหลายแบบให้เลือก สิ่งนี้ดูเหมือนจะไม่ทำงานในกรณีที่มีหลายตัวเลือก (อย่างน้อยใน Chrome 25)
Georgii Ivankin

2
ตามที่ @ ring0 ชี้ให้เห็นเมื่อ valueToSelect ไม่มีอยู่มันจะแทรกรายการว่างไว้ใน chrome ในขณะที่ IE และ firefox เก็บค่าที่เลือกไว้ล่าสุด
Karthik Bose

1
หมายเหตุสำหรับ IE: <option> จะต้องมีแอตทริบิวต์ value = 'valueToSelect' คุณไม่สามารถใช้ข้อความที่แสดงใน <option> .. </option> เป็นค่า ToTo Select
Peter Quiring

4
หากคุณต้องการให้เหตุการณ์การเปลี่ยนแปลงถูกไล่ออกคุณควรทำเช่นกัน: element.dispatchEvent(new Event('change'));
Patrick James McDougle

120

หากคุณใช้ jQuery คุณสามารถทำสิ่งนี้ได้:

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

สิ่งนี้จะเลือก<option>ด้วยค่า 14


ด้วย Javascript ธรรมดาคุณสามารถทำได้สองDocumentวิธี :

  • ด้วยdocument.querySelectorคุณสามารถเลือกองค์ประกอบตามตัวเลือก CSS:

    document.querySelector('#leaveCode').value = '14'
  • การใช้วิธีการที่เป็นที่ยอมรับมากขึ้นdocument.getElementById()ซึ่งจะช่วยให้คุณสามารถเลือกองค์ประกอบตามid:

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

คุณสามารถเรียกใช้โค้ดด้านล่างเพื่อดูวิธีการเหล่านี้และฟังก์ชั่น jQuery:


4
สามารถใช้สำหรับการเลือกแบบมัลติ เพียงผ่านอาร์เรย์ของสตริงไปยังฟังก์ชัน 'val' แทนที่จะเป็นสตริงเดี่ยว ดู: stackoverflow.com/a/16583001/88409
Triynko

มีวิธีการยังเรียก $ ( '# leaveCode') บน ( 'เปลี่ยน' ฟังก์ชั่น () ด้วยการทำที่.
Lieuwe

5
$ ( "# leaveCode") Val ( "14") การเปลี่ยนแปลง ()..;
Loren


16

ไม่ตอบคำถาม แต่คุณยังสามารถเลือกตามดัชนีโดยที่ i คือดัชนีของรายการที่คุณต้องการเลือก:

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

นอกจากนี้คุณยังสามารถวนซ้ำไอเท็มเพื่อเลือกโดยแสดงค่าด้วยลูป:

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

4
ไม่ควร formObj.leaveCode [i] .selected = true เป็น formObj.options [i] .selected = true; ?
David Christopher Reynolds

14

ฉันเปรียบเทียบวิธีการต่าง ๆ :

เปรียบเทียบวิธีต่างๆในการตั้งค่าการเลือกด้วย JS หรือ jQuery

รหัส:

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

เอาต์พุตบนตัวเลือกที่มีองค์ประกอบ ~ 4000:

  • 1 มิลลิวินาที
  • 58 ms
  • 612 มิลลิวินาที

ด้วย Firefox 10 หมายเหตุ: เหตุผลเดียวที่ฉันทำแบบทดสอบนี้ก็คือเพราะ jQuery มีประสิทธิภาพต่ำมากในรายการของเราที่มี ~ 2000 รายการ (พวกเขามีข้อความยาวกว่าระหว่างตัวเลือก) เรามีเวลาประมาณ 2 วินาทีหลังจาก val ()

หมายเหตุเช่นกัน: ฉันกำลังตั้งค่าขึ้นอยู่กับมูลค่าจริงไม่ใช่ค่าข้อความ



9

ฉันได้ลองใช้ JavaScript / jQuery-based โซลูชั่นเช่น:

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

และ

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

ในแอป AngularJS ที่มีความจำเป็นต้องใช้ <select> องค์ประกอบ

ไม่สามารถใช้งานได้เนื่องจากไม่ได้ทำการตรวจสอบความถูกต้องของแบบฟอร์ม AngularJS แม้ว่าจะมีการเลือกตัวเลือกที่ถูกต้อง (และแสดงในแบบฟอร์ม) อินพุตยังคงไม่ถูกต้อง ( คลาสng-pristineและคลาสng- ไม่ถูกต้องยังคงปรากฏอยู่)

หากต้องการบังคับใช้การตรวจสอบ AngularJS ให้โทร jQuery change ()หลังจากเลือกตัวเลือก:

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

และ

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

เหตุใดจึงต้องใช้ jQuery สำหรับสิ่งนี้เมื่อคุณสามารถทำได้ด้วย Angular แล้ว? เมื่อใช้ Angular เองคุณไม่สามารถตั้งค่าได้ด้วยการสนับสนุนในตัวสำหรับเรียกการเปลี่ยนแปลง (ไม่ทราบว่าฉันใช้ React พบโพสต์นี้หลังจาก google 5 วินาที: stackoverflow.com/questions/ 50302062 / … )? เพราะนั่นหมายความว่าคุณไม่ต้องแฮ็กรอบ ๆ แองกูลาร์พร้อมกับอีก± 30kb
ไลบรารี่


3

วิธีที่ง่ายที่สุดถ้าคุณต้องการ:
1) คลิกปุ่มที่กำหนดตัวเลือกที่เลือก
2) ไปที่หน้าอื่นโดยที่ตัวเลือกที่เลือกคือ
3) ให้เลือกค่าตัวเลือกนั้นในหน้าอื่น

1)ลิงก์ปุ่มของคุณ (พูดในหน้าแรก)

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

(โดยที่contact.phpเป็นหน้าของคุณที่มีตัวเลือกให้เลือกหมายเหตุ url หน้ามี? option = 1 หรือ 2)

2)ใส่รหัสนี้ในหน้าสองของคุณ (my case contact.php )

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

3)เลือกค่าตัวเลือกขึ้นอยู่กับปุ่มที่คลิก

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

.. และอื่น ๆ
ดังนั้นนี่เป็นวิธีที่ง่ายในการส่งผ่านค่าไปยังหน้าอื่น (ด้วยรายการตัวเลือกที่เลือก) ผ่าน GET ใน url ไม่มีรูปแบบไม่มีรหัส .. เพียง 3 ขั้นตอนและทำงานได้อย่างสมบูรณ์แบบ


1

ทำไมไม่เพิ่มตัวแปรสำหรับ Id ขององค์ประกอบและทำให้มันเป็นฟังก์ชั่นที่ใช้ซ้ำได้?

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

1

สมมติว่าแบบฟอร์มของคุณชื่อ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

ควรเป็นบางสิ่งบางอย่างตามบรรทัดเหล่านี้:

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

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

2
เมื่อเพิ่มคำตอบให้กับคำถามอายุสิบเอ็ดปีกับคำตอบที่มีอยู่สิบหกข้อมันสำคัญมากที่จะต้องชี้ให้เห็นว่าคำถามใหม่ ๆ หากคุณทำไม่ได้และการเปลี่ยนแปลงของคุณอาจไม่ได้ผลและคำตอบของคุณจะถูกลบออกเนื่องจากซ้ำซ้อน คำตอบของรหัสเท่านั้นที่สามารถปรับปรุงได้ตลอดเวลาโดยการเพิ่มคำอธิบายเกี่ยวกับวิธีการและสาเหตุที่ทำงาน
Jason Aller

-1

หากใช้ PHP คุณสามารถลองดังนี้:

$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

คุณน่าจะต้องการสิ่งนี้มากที่สุด:

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

หรือ

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

8
นี่คือการสมมติว่า OP กำลังใช้ JQuery แม้ว่า
Barry Michael Doyle

2
@BarryMichaelDoyle using JavaScriptซึ่งไม่ได้เพราะแม้แต่ชื่อของคำถามปลายด้วย
Iulian Onofrei

-6

ฉันเกรงว่าฉันไม่สามารถทดสอบได้ในขณะนี้ แต่ก่อนหน้านี้ฉันเชื่อว่าฉันต้องให้แท็ก ID แต่ละตัวเลือกจากนั้นฉันก็ทำสิ่งที่ชอบ:

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

ถ้านั่นไม่ได้ผลอาจจะทำให้คุณเข้าใกล้โซลูชันมากขึ้น: P


3
HTMLOptionElementไม่ได้มีselect()วิธีการ (มันไม่ได้กำหนดวิธีการใด ๆ เพิ่มเติมกว่ากำหนดมาตรฐานในองค์ประกอบ HTML ทั้งหมด) อย่างไรก็ตามคุณสามารถตั้งค่าselectedคุณสมบัติเป็นจริง
MrWhite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.