Jak wyczyścić wszystkie opcje w menu rozwijanym?


153

Mój kod działa w IE, ale psuje się w Safari, Firefox i Opera. (Wielka niespodzianka)

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

Po przeszukaniu dowiedziałem się, length=0że to tego nie lubi.
Próbowałem ...options=nulliz var clear=0; ...length=cleartakim samym wynikiem.

Robię to na wielu obiektach naraz, więc szukam lekkiego kodu JS.


Aby zniszczyć wszystkie opcje (!?), A około przywrócić historię przeglądarki wybranych opcji po odświeżania strony, aby użyć na HTML <option selected>?? (google umieściło nas tutaj, ale go tu nie ma) ... Zobacz document.getElementById ("form1"). reset () prawdziwe rozwiązanie.
— Peter Krauss,

Odpowiedzi:


34

Aby wyczyścić wszystkie elementy, możesz użyć następujących poleceń.

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

14
MooTools też ma empty(), więc byś zrobił$("DropList").empty();
— Brian Koser

42
Wydaje się, że to zły pomysł - ustawienie pozycji na wartość NULL to nie to samo, co ich usunięcie.

9
To również nie działa zgodnie z oczekiwaniami. Kiedy używam tego kodu, pozostawia jeden obiekt na liście rozwijanej.
— gabrjan

9
Ten kod może ulec awarii. Najbezpieczniejszy sposób na odwrócenie pętli.
— Kangkan

19
Sprawdź inne odpowiedzi, aby lepiej to zrobić.
— Tim Cavanaugh

296

Aby usunąć opcje elementu HTML programu select, możesz skorzystać z remove()metody:

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

Ważne jest, aby usunąć optionstył; ponieważ remove()metoda przestawia optionskolekcję. W ten sposób gwarantuje się, że element do usunięcia nadal istnieje!


9
okrzyki za to @Fabiano, to faktycznie usuwa elementy w przeciwieństwie do innych sugestii.
— Konstanca

4
kluczem tutaj jest przechodzenie do tyłu selektora. opcje myślę ... to rozwiązanie zawiodło, gdy próbowałem przechodzić do przodu
— scottysseus

7
Tak, nie powiedzie się, ponieważ metoda remove () zmieni układ tablicy. Zrobienie tego wstecz zagwarantuje, że element do usunięcia będzie istniał.
— Fabiano,

Dodanie selectbox.options.length = 0; w końcu definicja może sprawić, że będzie doskonała we wszystkich przeglądarkach.
— omkar sirra

4
Prosty kod to while (selectEl.options.length) selectEl.options.remove (0)
— MiF

127

Jeśli chcesz mieć lekki skrypt, wybierz jQuery. W jQuery rozwiązaniem do usunięcia wszystkich opcji będzie:

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

46
Twierdzę, że samo dodanie jQuery jest przeciwieństwem „lekkości”, kiedy for (a in select.options) { select.options.remove(0); }to działa dobrze.
— Artog

7
To zależy od kontekstu. W aplikacji internetowej czytelność stu wierszy $("#droplist").empty();kodu typu w porównaniu z tysiącami wierszy zwykłego kodu JS sprawia, że ​​warto dodać jQuery. Jeśli mówimy o znacznikach / kosmetykach dla prostej strony internetowej, masz 100% racji.
— Half_Duplex

3
@AdamIngmansson Uważam, że to zagadkowe, gdy ludzie oczerniają użycie JQuery. Użyłbym metody takiej jak ta, zakładając, że inżynierowie stojący za JQ wykonali wszelkiego rodzaju testy, aby znaleźć najlepszy, najszybszy i przede wszystkim najbardziej niezawodny sposób wykonania danego (użytecznego) zadania. Celem JQ (lub jakiejkolwiek dobrej biblioteki) jest podjęcie przyziemnych zadań, abyś mógł skoncentrować się na interesujących rzeczach.
— mike gryzoń

2
@mikerodent Nie mam wątpliwości, że sama funkcja jest najwyższej jakości i wydajności. Ale ładowanie pliku 86kb (skompresowana biblioteka wersji 3.2.1) tylko dla tej małej funkcji nie jest „lekkie” :) Oczywiście, jeśli korzystasz z wielu innych funkcji, warto użyć jQuery. To bardzo dobra biblioteka
— Artog 08

1
@AdamIngmansson Wystarczająco dobrze! Ale rozumiem, że zdajesz sobie sprawę, że plik JQ min.js jest używany tak często, że bardzo często znajduje się w pamięci podręcznej przeglądarki. Do tego stopnia, że ​​prawdopodobnie istnieje dobry argument za powiedzeniem "zawsze używaj JQ i NIE traktuj go jako części etapu optymalizacji, JEŚLI to naprawdę okaże się konieczne". Być może rzeczywiście może się to okazać konieczne w pewnych kontekstach (aplikacje na telefon itp.) ... to przekracza moją marną wiedzę o JS.
— mike gryzoń

105

Prawdopodobnie nie jest to najczystsze rozwiązanie, ale jest zdecydowanie prostsze niż usuwanie pojedynczo:

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

Zazwyczaj unikam innertHTML jak zarazy. Ale to sprawia, że ​​wszystko jest o wiele prostsze, że tak naprawdę to lubię.
— petersaints

Nie mogłem zmusić tego do pracy. Nie wiem, dlaczego ta opcja nie usuwa w ten sposób opcji wyboru.
— MikaelL

@MikaelL, przydatne, jeśli dodasz przeglądarkę, w której to się dzieje. I jej wersję, jeśli pamiętasz.
— użytkownik

70

To najlepszy sposób:

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

To uratowało mnie dzisiaj, ponieważ mechanizm „for () {selectbox.remove ()}” w jakiś sposób nie usuwa wszystkich opcji. Dzięki.
— sonlexqt

4
nieco krótszy niżwhile (comboBox.options.length) comboBox.remove(0);
— EkriirkE


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

1
To jedyne rozwiązanie, które u mnie działa. Iceweasel 10.0.12 i Chrome 26.
— davide

16

Chciałbym zaznaczyć, że problem w pierwotnym pytaniu nie ma już dziś znaczenia. A jest jeszcze krótsza wersja tego rozwiązania:

selectElement.length = 0;

Przetestowałem, że obie wersje działają w Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, najnowszych wersjach Chrome, Firefox, Samsung Internet i UC Browser na Androidzie, Safari na iPhone 6S, Android 4.2. 2 przeglądarka zapasowa. Myślę, że można bezpiecznie stwierdzić, że jest on całkowicie kompatybilny z dowolnym urządzeniem, które jest obecnie, więc polecam takie podejście.


11

To trochę nowoczesny i czysty JavaScript

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


1
Najszybszy kod. Do testów spróbuj usunąć około 250000 opcji
— Andrej

7

z PrototypeJS :

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

6

Jeśli używasz JQuery i kontrolka wyboru ma identyfikator „DropList”, możesz usunąć jej opcje w ten sposób:

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

Właściwie to działa dla mnie z każdą listą opcji, taką jak datalist.

Mam nadzieję, że to pomoże.


5
Dobra odpowiedź powinna zawierać więcej szczegółów. Czytelnik może nie mieć pojęcia, że ​​prawdopodobnie masz na myśli jQuery.
— Mifeet

5
@Mifeet, jeśli użytkownik nie ma pojęcia, co oznacza tutaj JQuery, powinien zmienić karierę
— Emilio Gort

6

Zauważ, że element select może mieć zarówno
kolekcję - optgroup, jak i
- options
jako swoje dzieci.

Więc,

Metoda nr 1

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

Metoda nr 2

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

Testowałem, oba działają na Chrome.
Podoba mi się prostsza, staroświecka metoda nr 1.


1
To najlepsza odpowiedź. Ponadto, jeśli masz już odniesienie jQuery do elementu select:$select.html('')
— the_nuts

5

Próbować

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

A może zajrzyj do funkcji removeChild ().

Lub jeśli używasz frameworka jQuery.

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


4

Można to wykorzystać do wyczyszczenia opcji:

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

Idź wstecz. Przyczyną jest zmniejszenie rozmiaru po każdym usunięciu.

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

Mam nadzieję, że ten kod ci pomoże



2

Najprostsze rozwiązania są najlepsze, wystarczy więc:

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

Elementy należy usunąć w odwrotnej kolejności, w przeciwnym razie spowoduje to błąd. Nie polecam też prostego ustawiania wartości na null, ponieważ może to spowodować nieoczekiwane zachowanie.

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

Lub jeśli wolisz, możesz uczynić z tego funkcję:

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

Powyższy kod odpowiedzi wymaga niewielkiej zmiany, aby całkowicie usunąć listę, sprawdź ten fragment kodu.

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

odświeżyć długość i usunie wszystkie dane z rozwijanej listy. Mam nadzieję, że to komuś pomoże.


Niezły dodatek - przez chwilę zastanawiałem się, dlaczego nie usuwa wszystkich opcji za każdym razem.
— Ralpharoo

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

0

Jeśli musisz obsługiwać IE i masz więcej niż 100 pozycji na swojej liście wyboru, zdecydowanie zalecamy rozważenie zastąpienia zaznaczenia taką funkcją:

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

Parametr select powinien być elementem z selektora jquery lub wywołania document.getElementBy. Jedynym minusem jest to, że tracisz zdarzenia, które podłączyłeś do elementu select, ale możesz je łatwo podłączyć ponownie, ponieważ są one zwracane z funkcji. Pracowałem z wyborem, który miał ~ 3k elementów, a wyczyszczenie zaznaczenia zajęłoby 4 sekundy w IE9, aby móc zaktualizować go o nową zawartość. Niemal natychmiast robi to w ten sposób.


Więcej informacji można znaleźć tutaj: somacon.com/p542.php i prostszy sposób:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
— FDisk,

0

W przypadku Vanilla JavaScript można to zrobić w prosty i elegancki sposób:

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

-1

Dzisiaj miałem ten sam problem, co przy przeładowywaniu zaznaczonego pudełka zrobiłem jak poniżej. (W zwykłym 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);

        }

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.