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.