ฉันจะล้างตัวเลือกทั้งหมดในกล่องแบบเลื่อนลงได้อย่างไร


153

รหัสของฉันทำงานใน IE แต่หยุดพักใน Safari, Firefox และ Opera (แปลกใจใหญ่)

document.getElementById("DropList").options.length=0;

หลังจากค้นหาฉันได้เรียนรู้ว่ามันlength=0ไม่ชอบ
ฉันพยายาม...options=nullแล้วvar clear=0; ...length=clearด้วยผลลัพธ์เดียวกัน

ฉันกำลังทำสิ่งนี้กับวัตถุหลายรายการในเวลาเดียวกันดังนั้นฉันกำลังมองหารหัส JS บางเบา


เพื่อทำลายตัวเลือกทั้งหมด (!?) และเกี่ยวกับการรีเซ็ตประวัติเบราว์เซอร์ของตัวเลือกที่เลือกหลังจากรีเฟรชหน้าเพื่อใช้ HTML หรือ <option selected>ไม่? (google วางเราที่นี่ แต่ไม่ได้อยู่ที่นี่) ... ดูdocument.getElementById ("form1"). reset ()ทางออกที่แท้จริง
Peter Krauss

คำตอบ:


35

คุณสามารถใช้สิ่งต่อไปนี้เพื่อล้างองค์ประกอบทั้งหมด

var select = document.getElementById("DropList");
var length = select.options.length;
for (i = length-1; i >= 0; i--) {
  select.options[i] = null;
}

14
MooTools มีempty()ดังนั้นคุณจะทำอย่างไร$("DropList").empty();
Brian Koser

42
ดูเหมือนว่าเป็นความคิดที่ไม่ดีการตั้งค่ารายการเป็นโมฆะนั้นไม่เหมือนกับการลบออก

9
นอกจากนี้ยังไม่สามารถใช้งานได้ตามปกติ เมื่อฉันใช้รหัสนั้นจะทำให้วัตถุหนึ่งตกอยู่ในรายการ
gabrjan

9
รหัสนี้อาจมีปัญหา วิธีที่ปลอดภัยที่สุดในการรันการวนซ้ำ
Kangkan

19
ตรวจสอบคำตอบอื่น ๆ เพื่อหาวิธีที่ดีกว่าในการทำสิ่งนี้
Tim Cavanaugh

296

ในการลบตัวเลือกขององค์ประกอบ HTML ของselectคุณสามารถใช้remove()วิธีการ:

function removeOptions(selectElement) {
   var i, L = selectElement.options.length - 1;
   for(i = L; i >= 0; i--) {
      selectElement.remove(i);
   }
}

// using the function:
removeOptions(document.getElementById('DropList'));

สิ่งสำคัญคือการลบoptionsถอยหลัง เป็นremove()วิธีการจัดเรียงoptionsคอลเลกชัน วิธีนี้รับประกันได้ว่าองค์ประกอบที่จะลบยังคงมีอยู่!


9
ไชโยสำหรับ @Fabiano สิ่งนี้จะลบรายการออกซึ่งตรงข้ามกับคำแนะนำอื่น ๆ
Constanta

4
กุญแจตรงนี้คือ traversal ด้านหลังของ selectbox.options ฉันคิดว่า .... วิธีแก้ปัญหานี้ล้มเหลวเมื่อฉันลองส่งต่อ traversal
scottysseus

7
ใช่มันจะล้มเหลวเพราะเมธอด remove () จะจัดเรียงอาร์เรย์ใหม่ การย้อนกลับจะรับประกันได้ว่าองค์ประกอบที่จะลบจะมีอยู่
Fabiano

การเพิ่ม selectbox.options.length = 0; ในตอนท้ายของคำนิยามอาจทำให้มันสมบูรณ์แบบในเบราว์เซอร์ทั้งหมด
omkar sirra

4
รหัสง่าย ๆ คือในขณะที่ (selectEl.options.length) selectEl.options.remove (0)
MiF

127

หากคุณต้องการมีสคริปต์ที่มีน้ำหนักเบาไปสำหรับ jQuery ใน jQuery โซลูชันสำหรับลบตัวเลือกทั้งหมดจะเป็นดังนี้:

$("#droplist").empty();

47
ฉันยืนยันว่าการเพิ่ม jQuery นั้นตรงข้ามกับ "น้ำหนักเบา" เมื่อfor (a in select.options) { select.options.remove(0); }ใดที่การทำงานดี
Artog

7
มันขึ้นอยู่กับบริบท ในเว็บแอปพลิเคชันการอ่าน$("#droplist").empty();โค้ดร้อยบรรทัดเมื่อเปรียบเทียบกับวานิลลา JS หลายพันบรรทัดทำให้คุ้มค่ากับการเพิ่ม jQuery หากเรากำลังพูดถึงมาร์กอัป / เครื่องสำอางสำหรับหน้าเว็บแบบง่ายคุณจะถูกต้อง 100%
Half_Duplex

3
@ AdamIngmansson ฉันพบว่ามันทำให้งงเมื่อคนปฏิเสธการใช้ JQuery ฉันจะใช้วิธีการเช่นนี้บนสมมติฐานที่ว่าวิศวกรที่อยู่เบื้องหลัง JQ ได้ทำการทดสอบทุกประเภทเพื่อหาวิธีที่ดีที่สุดเร็วที่สุดและเหนือกว่าวิธีที่เชื่อถือได้ที่สุดในการทำภารกิจ (ยูทิลิตี้) จุดประสงค์ของ JQ (หรือห้องสมุดที่ดี) คือการทำภารกิจทางโลกเพื่อให้คุณมีสมาธิกับสิ่งที่น่าสนใจ
ไมค์สัตว์ฟันแทะ

2
@ Mikerodent ฉันไม่สงสัยเลยว่าฟังก์ชั่นนั้นมีคุณภาพและประสิทธิภาพสูงสุด แต่การโหลดไฟล์ขนาด 86kb (lib ที่ถูกบีบอัดของเวอร์ชั่น 3.2.1) สำหรับฟังก์ชั่นเล็ก ๆ นั้นไม่ใช่ 'จริงจัง' :) แน่นอนถ้าคุณใช้ฟังก์ชั่นอื่น ๆ อีกมากมายมันจะคุ้มค่าที่จะใช้ jQuery มันเป็นห้องสมุดที่ดีมาก
Artog

1
@AdamIngmansson ยุติธรรมเพียงพอ! แต่ฉันเข้าใจว่าคุณใช้ไฟล์ JQ min.js บ่อยครั้งที่พบบ่อยในแคชของเบราว์เซอร์ ในระดับที่อาจมีข้อโต้แย้งที่ดีสำหรับการพูดว่า "ใช้ JQ เสมอและถือว่าไม่ได้ใช้มันเป็นส่วนหนึ่งของขั้นตอนการปรับให้เหมาะสมถ้าสิ่งนี้พิสูจน์ได้ว่าจำเป็นจริงๆ" มันอาจพิสูจน์ได้ว่าจำเป็นในบางบริบท (แอพโทรศัพท์ ฯลฯ ) ... นี่คือสิ่งที่เกินความรู้ JS ของฉัน
ไมค์สัตว์ฟันแทะ

105

อาจไม่ใช่วิธีที่สะอาดที่สุด แต่แน่นอนว่าง่ายกว่าการลบทีละตัว:

document.getElementById("DropList").innerHTML = "";

ฉันมักจะหลีกเลี่ยง InnertHTML เหมือนโรคระบาด แต่นี่ทำให้สิ่งต่าง ๆ ง่ายขึ้นกว่าที่ฉันชอบจริงๆ
เตอร์

ฉันทำงานนี้ไม่ได้ ไม่แน่ใจว่าทำไมไม่ล้างตัวเลือกตัวเลือกด้วยวิธีนี้
MikaelL

@MikaelL มันมีประโยชน์ถ้าคุณเพิ่มเบราว์เซอร์ที่มันเกิดขึ้นและเวอร์ชั่นของมันถ้าคุณจำได้
ผู้ใช้

70

นี่คือวิธีที่ดีที่สุด:

function (comboBox) {
    while (comboBox.options.length > 0) {                
        comboBox.remove(0);
    }        
}

สิ่งนี้ช่วยฉันในวันนี้เนื่องจากกลไก 'for () {selectbox.remove ()}' ไม่ได้ล้างตัวเลือกทั้งหมด ขอบคุณ
sonlexqt

4
สั้นลงเล็กน้อยwhile (comboBox.options.length) comboBox.remove(0);
EkriirkE


16
function removeOptions(obj) {
    while (obj.options.length) {
        obj.remove(0);
    }
}

1
วิธีนี้เป็นวิธีเดียวที่ใช้ได้ผลสำหรับฉัน Iceweasel 10.0.12 และ Chrome 26.
davide

16

ฉันต้องการจะชี้ให้เห็นว่าปัญหาในคำถามเดิมไม่เกี่ยวข้องในวันนี้อีกต่อไป และมีโซลูชันที่สั้นกว่า:

selectElement.length = 0;

ฉันทดสอบว่าทั้งสองรุ่นทำงานใน Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, Chrome เวอร์ชันล่าสุด, Firefox, Samsung Internet และ UC Browser บน Android, Safari บน iPhone 6S, Android 4.2 2 เบราว์เซอร์หุ้น ฉันคิดว่ามันปลอดภัยที่จะสรุปว่ามันเข้ากันได้กับอุปกรณ์อะไรก็ตามที่มีอยู่ตอนนี้ดังนั้นฉันจึงแนะนำวิธีนี้


11

นี่คือ JavaScript ที่ทันสมัยและบริสุทธิ์เล็กน้อย

document.querySelectorAll('#selectId option').forEach(option => option.remove())


1
รหัสที่เร็วที่สุด สำหรับการทดสอบลองลบประมาณ 250000 ตัวเลือก
Andrej


6

หากคุณกำลังใช้ JQuery และตัวควบคุมที่คุณเลือกมี ID "DropList" คุณสามารถลบตัวเลือกของมันได้ด้วยวิธีนี้:

$('#DropList option').remove();

อันที่จริงมันใช้งานได้สำหรับฉันกับรายการตัวเลือกเช่น datalist

หวังว่ามันจะช่วย


5
คำตอบที่ดีควรมีรายละเอียดมากกว่านี้ ผู้อ่านอาจไม่ทราบว่าคุณอาจหมายถึง jQuery
Mifeet

5
@Mifeet หากผู้ใช้ไม่ทราบว่า JQuery หมายถึงอะไรที่นี่เขา / เธอควรเปลี่ยนอาชีพ
Emilio Gort

6

โปรดทราบว่าตัวเลือกสามารถมีทั้ง
- optgroup &
- ตัวเลือกคอลเลกชัน
เป็นลูก ๆ

ดังนั้น,

วิธีที่ # 1

var selectElement = document.getElementById('myselectid');
selectElement.innerHTML = '';

วิธีที่ # 2

var selectElement = document.getElementById('myselectid');
selectElement.textContent = '';

ฉันทดสอบแล้วทั้งทำงานบน Chrome
ฉันชอบวิธีที่ง่ายกว่าแบบเก่าวิธี # 1


1
นี่คือคำตอบที่ดีที่สุด นอกจากนี้หากคุณมี jquery ที่อ้างอิงถึง select:$select.html('')
the_nuts

5

ลอง

document.getElementsByTagName("Option").length=0

หรืออาจดูที่ฟังก์ชัน removeChild ()

หรือถ้าคุณใช้ jQuery framework

$("DropList Option").each(function(){$(this).remove();});


4

สามารถใช้เพื่อล้างตัวเลือก:

function clearDropDown(){
  var select = document.getElementById("DropList"),
      length = select.options.length;
  while(length--){
    select.remove(length);
  }
}
<select id="DropList" >
  <option>option_1</option>
  <option>option_2</option>
  <option>option_3</option>
  <option>option_4</option>
  <option>option_5</option>
</select>
<button onclick="clearDropDown()">clear list</button>


3

ย้อนกลับ เหตุผลคือขนาดลดลงหลังจากการลบแต่ละครั้ง

for (i = (len-1); i > -1; i--) {
    document.getElementById("elementId").remove(i);
}

3
var select = document.getElementById("DropList");
var length = select.options.length;
for (i = 0; i < length; i++) {
  select.options[i].remove();
}

หวังว่ารหัสนี้จะช่วยคุณ



2

ทางออกที่ง่ายที่สุดดีที่สุดดังนั้นคุณแค่ต้องการ:

var list = document.getElementById('list');
while (list.firstChild) {
    list.removeChild(list.firstChild);
}
<select id="list">
  <option value="0">0</option>
  <option value="1">1</option>
</select>


2

รายการควรจะลบในทางตรงกันข้ามมิฉะนั้นมันจะทำให้เกิดข้อผิดพลาด นอกจากนี้ฉันไม่แนะนำเพียงตั้งค่าnullเป็นเพราะอาจทำให้เกิดพฤติกรรมที่ไม่คาดคิด

var select = document.getElementById("myselect");
for (var i = select.options.length - 1 ; i >= 0 ; i--)
    select.remove(i);

หรือหากคุณต้องการคุณสามารถทำให้เป็นฟังก์ชัน:

function clearOptions(id)
{
    var select = document.getElementById(id);
    for (var i = select.options.length - 1 ; i >= 0 ; i--)
        select.remove(i);
}
clearOptions("myselect");


1

รหัสคำตอบข้างต้นจำเป็นต้องมีการเปลี่ยนแปลงเล็กน้อยเพื่อลบรายการที่สมบูรณ์โปรดตรวจสอบรหัสชิ้นนี้

var select = document.getElementById("DropList");
var length = select.options.length;
for (i = 0; i < length;) {
  select.options[i] = null;
  length = select.options.length;
}

รีเฟรชความยาวและมันจะลบข้อมูลทั้งหมดจากรายการแบบเลื่อนลง หวังว่านี่จะช่วยใครซักคน


การเพิ่มที่ดี - ถูกนิ่งงันสักครู่ว่าทำไมมันถึงไม่ลบตัวเลือกทั้งหมดในแต่ละครั้ง
Ralpharoo

0
while(document.getElementById("DropList").childNodes.length>0) 
{
    document.getElementById("DropList").removeChild(document.getElementById("DropList").childNodes[0]);
}

0

หากคุณต้องรองรับ IE และคุณมีมากกว่า 100 รายการในรายการที่คุณเลือกฉันขอแนะนำให้คุณพิจารณาแทนที่การเลือกด้วยฟังก์ชันดังนี้:

function clearOptions(select) {
    var selectParentNode = select.parentNode;
    var newSelect = select.cloneNode(false); // Make a shallow copy
    selectParentNode.replaceChild(newSelect, select);
    return newSelect;
}

พารามิเตอร์ select ควรเป็นองค์ประกอบทั้งจากตัวเลือก jquery หรือ document.getElementBy ข้อเสียเพียงอย่างเดียวคือคุณสูญเสียกิจกรรมที่คุณต่อสายไปยังตัวเลือก แต่คุณสามารถใส่กลับเข้าไปใหม่ได้อย่างง่ายดายเนื่องจากมันถูกส่งกลับจากฟังก์ชั่น ฉันทำงานกับตัวเลือกที่มีรายการ ~ 3k และใช้เวลา 4 วินาทีใน IE9 เพื่อล้างการเลือกเพื่อให้ฉันสามารถอัปเดตด้วยเนื้อหาใหม่ เกือบจะทันทีที่ทำเช่นนี้


คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่: somacon.com/p542.phpและวิธีที่ง่ายขึ้น:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
FDisk

0

สำหรับ Vanilla JavaScript มีวิธีที่ง่ายและสง่างามในการทำสิ่งนี้:

for(var o of document.querySelectorAll('#DropList > option')) {
  o.remove()
}

-1

วันนี้ฉันประสบปัญหาเดียวกันฉันทำตามด้านล่างขณะโหลดกล่องเลือกอีกครั้ง (ใน JS ธรรมดา)

        var select = document.getElementById("item");
        select.options.length = 0;
        var opt = document.createElement('option');
        opt.value = 0;
        opt.innerHTML = "Select Item ...";
        opt.selected = "selected";
        select.appendChild(opt);


       for (var key in lands) {
            var opt = document.createElement('option');
            opt.value = lands[key].id;
            opt.innerHTML = lands[key].surveyNo;
            select.appendChild(opt);

        }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.