Làm cách nào để xóa tất cả các tùy chọn trong hộp thả xuống?


153

Mã của tôi hoạt động trong IE nhưng bị hỏng trong Safari, Firefox và Opera. (bất ngờ lớn)

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

Sau khi tìm kiếm, tôi đã học được rằng nó length=0không giống như vậy.
Tôi đã thử ...options=nullvar clear=0; ...length=clearvới kết quả tương tự.

Tôi đang làm điều này cho nhiều đối tượng cùng một lúc, vì vậy tôi đang tìm kiếm một số mã JS nhẹ.


Để hủy tất cả các tùy chọn (!?) Và về cách đặt lại lịch sử các tùy chọn đã chọn của trình duyệt sau trang làm mới, để sử dụng HTML <option selected>?? (google đặt chúng tôi ở đây nhưng nó không ở đây) ... Xem tài liệu.getEuityById ("form1"). reset () giải pháp thực.
Peter Krauss

Câu trả lời:


34

Bạn có thể sử dụng như sau để xóa tất cả các yếu tố.

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

14
MooTools cũng có empty(), vì vậy bạn sẽ làm$("DropList").empty();
Brian Koser

42
Đây có vẻ là một ý tưởng tồi - đặt các mục thành null không giống như loại bỏ chúng.

9
Nó cũng không hoạt động như được khuyến khích. Khi tôi sử dụng mã đó, nó để lại một đối tượng trong danh sách thả xuống.
gabrjan

9
Mã này có thể bị sập. Cách an toàn nhất để chạy vòng lặp ngược.
Kangkan

19
Kiểm tra các câu trả lời khác cho một cách tốt hơn để làm điều này.
Tim Cavanaugh

296

Để xóa các tùy chọn của phần tử HTML select, bạn có thể sử dụng remove()phương thức:

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'));

Điều quan trọng là phải loại bỏ optionsngược; như remove()phương pháp sắp xếp lại optionsbộ sưu tập. Bằng cách này, đảm bảo rằng phần tử cần loại bỏ vẫn tồn tại!


9
chúc mừng cho @Fabiano, điều này thực sự loại bỏ các mục trái ngược với các đề xuất khác.
Constanta

4
chìa khóa ở đây là truyền tải ngược của selectbox.options tôi nghĩ .... giải pháp này đã thất bại khi tôi thử chuyển tiếp qua
scottysseus

7
Có, nó sẽ thất bại vì phương thức remove () sẽ sắp xếp lại mảng. Làm ngược lại sẽ đảm bảo rằng phần tử cần loại bỏ sẽ tồn tại.
Fabiano

Thêm selectbox.options.length = 0; ở cuối định nghĩa có thể làm cho nó hoàn hảo trong tất cả các trình duyệt.
omkar sirra

4
Mã đơn giản là while (selectEl.options.length) selectEl.options.remove (0)
MiF 17/11/17

127

Nếu bạn muốn có một kịch bản nhẹ, thì hãy tìm jQuery. Trong jQuery, giải pháp xóa tất cả các tùy chọn sẽ như sau:

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

46
Tôi cho rằng chính hành động thêm jQuery lại trái ngược với "nhẹ" khi for (a in select.options) { select.options.remove(0); }công việc vẫn ổn.
Artog

7
Nó phụ thuộc vào ngữ cảnh. Trong một ứng dụng web, khả năng đọc hàng trăm dòng $("#droplist").empty();mã loại so với hàng ngàn dòng vanilla JS làm cho nó đáng để bổ sung jQuery. Nếu chúng ta đang nói về đánh dấu / mỹ phẩm cho một trang web đơn giản, bạn đã chính xác 100%.
Half_Duplex

3
@AdamIngmansson Tôi thấy khó hiểu khi mọi người chê bai việc sử dụng JQuery. Tôi sẽ sử dụng một phương pháp như thế này với giả định rằng các kỹ sư đằng sau JQ đã thực hiện tất cả các loại thử nghiệm để tìm ra phương tiện tốt nhất, nhanh nhất và trên hết là đáng tin cậy nhất để thực hiện một nhiệm vụ (tiện ích) nhất định. Quan điểm của JQ (hoặc bất kỳ thư viện tốt) là đảm nhận các nhiệm vụ trần tục để bạn có thể tập trung vào những điều thú vị.
mike gặm nhấm

2
@mikerodent Tôi không có nghi ngờ rằng chính chức năng này có chất lượng và hiệu suất hàng đầu. Nhưng việc tải tệp 86kb (lib nén của phiên bản 3.2.1) chỉ cho chức năng nhỏ đó không phải là 'nhẹ' :) Tất nhiên, nếu bạn đã sử dụng nhiều chức năng khác, thì nó sẽ đáng sử dụng jQuery. Đó là một thư viện rất tốt
Artog

1
@AdamIngmansson Hội chợ đủ rồi! Nhưng tôi tin rằng bạn biết rằng tệp JQ min.js được sử dụng rất thường xuyên, nó thường được tìm thấy trong bộ đệm của trình duyệt. Ở một mức độ nào đó có lẽ có một lý lẽ tốt để nói rằng "luôn luôn sử dụng JQ và coi KHÔNG sử dụng nó như là một phần của giai đoạn tối ưu hóa, NẾU điều này thực sự chứng minh là cần thiết". Nó thực sự có thể chứng minh là cần thiết trong một số bối cảnh nhất định (ứng dụng điện thoại, v.v.) ... điều này nằm ngoài kiến ​​thức về JS của tôi.
mike gặm nhấm

105

Có lẽ, không phải là giải pháp sạch nhất, nhưng nó chắc chắn đơn giản hơn việc loại bỏ từng cái một:

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

Tôi thường tránh innertHTML như bệnh dịch hạch. Nhưng điều này làm cho mọi thứ đơn giản hơn nhiều mà tôi thực sự thích nó.
hoa hồng

Tôi không thể làm việc này. Không chắc chắn tại sao không xóa các tùy chọn chọn theo cách này.
MikaelL

@MikaelL, thật hữu ích nếu bạn thêm trình duyệt nào xảy ra. Và phiên bản của nó, nếu bạn có thể nhớ.
người dùng

70

Đây la cach tôt nhât :

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

Điều này đã tiết kiệm cho tôi ngày hôm nay, bởi vì cơ chế 'for () {selectbox.remove ()}' bằng cách nào đó không xóa tất cả các tùy chọn. Cảm ơn.
sonlexqt

4
ngắn hơn một chút nhưwhile (comboBox.options.length) comboBox.remove(0);
EkriirkE


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

1
Giải pháp này là người duy nhất làm việc cho tôi. Iceweasel 10.0.12 và Chrome 26.
davide

16

Tôi muốn chỉ ra rằng vấn đề trong câu hỏi ban đầu không còn phù hợp ngày hôm nay nữa. Và thậm chí còn có phiên bản ngắn hơn của giải pháp đó:

selectElement.length = 0;

Tôi đã thử nghiệm rằng cả hai phiên bản đều hoạt động trong Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, các phiên bản mới nhất của Chrome, Firefox, Samsung Internet và UC Browser trên Android, Safari trên iPhone 6S, Android 4.2. 2 trình duyệt chứng khoán. Tôi nghĩ thật an toàn khi kết luận rằng nó hoàn toàn tương thích với bất kỳ thiết bị nào hiện có, vì vậy tôi khuyên bạn nên sử dụng phương pháp này.


11

Đây là một chút JavaScript hiện đại và thuần túy

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


1
Mã nhanh nhất. Để thử nghiệm, hãy thử xóa khoảng 250000 tùy chọn
Andrej

7

với PrototypeJS :

$('yourSelect').select('option').invoke('remove');

6

Nếu bạn đang sử dụng JQuery và điều khiển chọn của bạn có ID "DropList", bạn có thể xóa các tùy chọn của nó theo cách này:

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

Trên thực tế, nó hoạt động với tôi với bất kỳ danh sách tùy chọn, như datalist.

Hy vọng nó giúp.


5
Một câu trả lời tốt nên chứa nhiều chi tiết hơn thế này. Người đọc có thể không biết rằng bạn có thể có nghĩa là jQuery.
Mifeet

5
@Mifeet nếu người dùng không biết JQuery nghĩa là gì ở đây, anh ấy / cô ấy nên thay đổi nghề nghiệp
Emilio Gort

6

Lưu ý rằng một lựa chọn có thể có cả hai
-
bộ sưu tập tùy chọn & - tùy chọn
làm con của nó.

Vì thế,

Phương pháp số 1

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

Phương pháp # 2

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

Tôi đã thử nghiệm, cả hai đều hoạt động trên Chrome.
Tôi thích cách đơn giản hơn, lỗi thời, phương pháp số 1.


1
Đây là câu trả lời tốt nhất. Ngoài ra, nếu bạn đã có một tham chiếu jquery để chọn:$select.html('')
the_nuts

5

Thử

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

Hoặc có thể xem xét hàm removeChild ().

Hoặc nếu bạn sử dụng khung jQuery.

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


4

Điều này có thể được sử dụng để xóa các tùy chọn:

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

Đi ngược lại. Lý do là kích thước giảm sau mỗi lần loại bỏ.

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

Hy vọng, mã này sẽ giúp bạn



2

Các giải pháp đơn giản nhất là tốt nhất, vì vậy bạn chỉ cần:

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

Các mục nên được loại bỏ ngược lại, nếu không nó sẽ gây ra lỗi. Ngoài ra, tôi không khuyên bạn chỉ nên đặt các giá trị thành null, vì điều đó có thể gây ra hành vi không mong muốn.

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

Hoặc nếu bạn thích, bạn có thể làm cho nó một chức năng:

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('/*id attribute of your select here*/');
for (var option in select){
    select.remove(option);
}

1

Mã trả lời ở trên cần một thay đổi nhỏ để xóa danh sách hoàn tất, vui lòng kiểm tra đoạn mã này.

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

làm mới độ dài và nó sẽ xóa tất cả dữ liệu khỏi danh sách thả xuống. Hy vọng điều này sẽ giúp được ai đó.


Một sự bổ sung tuyệt vời - đã bị bối rối trong một khoảnh khắc về lý do tại sao nó không loại bỏ tất cả các tùy chọn mỗi lần.
Ralpharoo

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

0

Nếu bạn phải hỗ trợ IE và bạn có hơn 100 mục trong danh sách lựa chọn của mình, tôi thực sự khuyên bạn nên xem xét thay thế lựa chọn bằng một chức năng như vậy:

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

Tham số select phải là thành phần từ một bộ chọn jquery hoặc lệnh gọi document.getEuityBy. Nhược điểm duy nhất của việc này là bạn mất các sự kiện mà bạn đã kết nối với lựa chọn, nhưng bạn có thể dễ dàng gắn lại chúng khi nó được đưa trở lại khỏi chức năng. Tôi đã làm việc với một lựa chọn có ~ 3k mục và sẽ mất 4 giây trên IE9 để xóa lựa chọn để tôi có thể cập nhật nó với nội dung mới. Gần như ngay lập tức làm theo cách này.


Bạn có thể tìm thêm thông tin ở đây: somacon.com/p542.php và cách đơn giản hơn:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
FDisk

0

Đối với Vanilla JavaScript, có một cách đơn giản và thanh lịch để làm điều này:

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

-1

Hôm nay tôi đã phải đối mặt với vấn đề tương tự, tôi đã làm như dưới đây trong khi tải lại hộp chọn. (Trong đồng bằng 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);

        }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.