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.

Kirt
źródło
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;
}
Nick Craver
źródło
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!

Fabiano
źródło
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();
Kangkan
źródło
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 = "";
Dmitry Shintyakov
źródło
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);
    }        
}
Rodrigo Longo
źródło
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
31

To jest krótka droga:

document.getElementById('mySelect').innerText = null

Jedna linia, nie dla, bez JQuery, prosta.

Strażacy 26
źródło
Nie najkrótsza, zobacz moją odpowiedź poniżej.
użytkownik
16
function removeOptions(obj) {
    while (obj.options.length) {
        obj.remove(0);
    }
}
Julio Garcia
źródło
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.

użytkownik
źródło
11

To trochę nowoczesny i czysty JavaScript

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

a_rahmanshah
źródło
1
Najszybszy kod. Do testów spróbuj usunąć około 250000 opcji
Andrej
7

z PrototypeJS :

$('yourSelect').select('option').invoke('remove');
EpokK
źródło
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.

norgematos
źródło
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.

Manohar Reddy Poreddy
źródło
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();});
Razor Storm
źródło
4

Używanie JQuery to ładniejszy, krótszy i sprytniejszy sposób na zrobienie tego!

$('#selection_box_id').empty();
Sobin Sunny
źródło
1
To tak naprawdę tylko powtórzenie tej istniejącej odpowiedzi .
Pang
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>

Vichu
źródło
3

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

for (i = (len-1); i > -1; i--) {
    document.getElementById("elementId").remove(i);
}
Dinesh Khetarpal
źródło
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

Nitika Chopra
źródło
2

Myślę, że to najlepszy sol. jest

 $ ("# myselectid"). html (''); 

Ossama Zakaria
źródło
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>

nitka.pawel
źródło
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");
Dan Bray
źródło
1
var select = document.getElementById('/*id attribute of your select here*/');
for (var option in select){
    select.remove(option);
}
kyllo
źródło
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.

Bez nazwy
źródło
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]);
}
user1910893
źródło
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.

Dan
źródło
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()
}
Piotr
źródło
-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);

        }
CHowdappaM
źródło
-2
var select =$('#selectbox').val();
user3767285
źródło
1
Powinieneś być bardziej opisowy w swojej odpowiedzi
Krupa Patel