Come posso cancellare tutte le opzioni in una casella a discesa?


153

Il mio codice funziona in IE ma si interrompe in Safari, Firefox e Opera. (grande sorpresa)

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

Dopo aver cercato, ho imparato che è length=0quello che non gli piace.
Ho provato ...options=nulle var clear=0; ...length=clearcon lo stesso risultato.

Lo sto facendo su più oggetti contemporaneamente, quindi sto cercando un codice JS leggero.


Per distruggere tutte le opzioni (!?) E ripristinare la cronologia del browser delle opzioni selezionate dopo la pagina di aggiornamento, per utilizzare l'HTML <option selected>?? (google ci ha messo qui ma non è qui) ... Vedi document.getElementById ("form1"). reset () soluzione reale.
— Peter Krauss,

Risposte:


34

È possibile utilizzare quanto segue per cancellare tutti gli elementi.

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

14
Anche MooTools lo ha fatto empty(), così faresti tu$("DropList").empty();
— Brian Koser,

42
Sembra una cattiva idea: impostare gli elementi su null non equivale a rimuoverli.

9
Inoltre non funziona come previsto. Quando uso quel codice, lascia un oggetto a discesa.
— gabrjan,

9
Questo codice potrebbe bloccarsi. Il modo più sicuro per eseguire il ciclo al contrario.
— Kangkan,

19
Controlla le altre risposte per un modo migliore per farlo.
— Tim Cavanaugh,

296

Per rimuovere le opzioni di un elemento HTML di select, è possibile utilizzare il remove()metodo:

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

È importante rimuovere il optionsretro; poiché il remove()metodo riorganizza la optionsraccolta. In questo modo, è garantito che l'elemento da rimuovere esista ancora!


9
Saluti per quel @Fabiano, questo in realtà rimuove gli elementi rispetto ad altri suggerimenti.
— Costanza,

4
la chiave qui è l'attraversamento all'indietro di selectbox.options penso ... questa soluzione non è riuscita quando ho provato l'attraversamento in avanti
— scottysseus,

7
Sì, fallirà perché il metodo remove () riorganizzerà l'array. Farlo all'indietro garantirà l'esistenza dell'elemento da rimuovere.
— Fabiano,

Aggiunta di selectbox.options.length = 0; alla fine della definizione potrebbe renderlo perfetto in tutti i browser.
— omkar sirra,

4
Il codice semplice è while (selectEl.options.length) selectEl.options.remove (0)
— MiF

127

Se desideri avere uno script leggero, scegli jQuery. In jQuery, la soluzione per rimuovere tutte le opzioni sarà simile a:

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

47
Direi che l'atto stesso di aggiungere jQuery è l'opposto di "leggero" quando for (a in select.options) { select.options.remove(0); }il lavoro va bene.
— Artog,

7
Dipende dal contesto. In un'applicazione web, la leggibilità di un centinaio di righe di $("#droplist").empty();codice di tipo rispetto a migliaia di righe di JS vaniglia rendono la pena l'aggiunta di jQuery. Se stiamo parlando di markup / cosmetici per una semplice pagina Web, hai ragione al 100%.
— Half_Duplex,

3
@AdamIngmansson Lo trovo sconcertante quando le persone denigrano l'uso di JQuery. Userei un metodo come questo supponendo che gli ingegneri dietro JQ abbiano fatto tutti i tipi di test per trovare i mezzi migliori, più veloci e soprattutto più affidabili per svolgere un determinato compito (utilità). Il punto di JQ (o di qualsiasi buona biblioteca) è quello di assumere i compiti banali in modo da poterti concentrare su cose interessanti.
— mike rodent,

2
@mikerodent Non ho dubbi che la funzione stessa sia di alta qualità e prestazioni. Ma caricare un file 86kb (la versione compressa della versione 3.2.1) solo per quella piccola funzione non è "leggero" :) Naturalmente, se si utilizzano molte delle altre funzionalità, varrà la pena usare jQuery. È un'ottima biblioteca
— Artog

1
@AdamIngmansson Abbastanza giusto! Ma credo che tu sappia che il file JQ min.js è usato così spesso che si trova molto spesso nella cache di un browser. A tal punto che probabilmente c'è un buon argomento per dire "usa sempre JQ e considera di NON usarlo come parte di una fase di ottimizzazione, SE questo si rivela davvero necessario". Potrebbe davvero rivelarsi necessario in determinati contesti (app telefoniche, ecc.) ... questo è al di là della mia scarsa conoscenza di JS.
— Mike Rodent,

105

Probabilmente, non è la soluzione più pulita, ma è sicuramente più semplice della rimozione uno a uno:

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

Di solito evito innertHTML come la peste. Ma questo rende le cose molto più semplici che in realtà mi piacciono.
— petersaints,

Non sono riuscito a farlo funzionare. Non so perché non cancella le opzioni di selezione in questo modo.
— MikaelL

@MikaelL, è utile se aggiungi il browser in cui si trova. E la sua versione, se ricordi.
— utente

70

Questo è il modo migliore:

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

Questo mi ha salvato oggi, perché il meccanismo 'for () {selectbox.remove ()}' in qualche modo non cancella tutte le opzioni. Grazie.
— Sonlexqt,

4
leggermente più corto diwhile (comboBox.options.length) comboBox.remove(0);
— EkriirkE

32

Questo è un modo breve:

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

Una riga, no per, no JQuery, semplice.


Non il più breve, vedi la mia risposta di seguito.
— utente

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

1
Questa soluzione è l'unica che funziona per me. Iceweasel 10.0.12 e Chrome 26.
— davide

16

Vorrei sottolineare che il problema nella domanda originale non è più rilevante oggi. E c'è anche una versione più breve di quella soluzione:

selectElement.length = 0;

Ho provato che entrambe le versioni funzionano in Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, ultime versioni di Chrome, Firefox, Samsung Internet e UC Browser su Android, Safari su iPhone 6S, Android 4.2. 2 browser stock. Penso che sia sicuro concludere che è assolutamente compatibile con qualsiasi dispositivo ci sia in questo momento, quindi consiglio questo approccio.


11

Questo è un po 'moderno e puro JavaScript

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


1
Codice più veloce. Per i test, prova a rimuovere circa 250000 opzioni
— Andrej,

7

con PrototypeJS :

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

6

Se stai usando JQuery e il tuo controllo di selezione ha ID "DropList" puoi rimuovere le sue opzioni in questo modo:

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

In realtà funziona per me con qualsiasi elenco di opzioni, come il datalist.

Spero che sia d'aiuto.


5
Una buona risposta dovrebbe contenere più dettagli di questo. Il lettore potrebbe non avere idea che probabilmente intendi jQuery.
— Mifeet,

5
@Mifeet se l'utente non ha idea di cosa significhi JQuery qui, dovrebbe cambiare carriera
— Emilio Gort,

6

Si noti che una selezione può avere entrambe le
opzioni - optgroup &
- options
come suoi figli.

Così,

Metodo n. 1

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

Metodo n. 2

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

Ho provato, entrambi funzionano su Chrome.
Mi piace il metodo n. 1 più semplice, vecchio stile.


1
Questa è la risposta migliore Inoltre, se hai già un riferimento jquery alla selezione:$select.html('')
— the_nuts

5

Provare

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

O forse guarda nella funzione removeChild ().

O se usi jQuery framework.

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


4

Questo può essere usato per cancellare le opzioni:

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

Vai indietro. Il motivo è che le dimensioni diminuiscono dopo ogni rimozione.

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

Spero che questo codice ti aiuti



2

Le soluzioni più semplici sono le migliori, quindi hai solo bisogno di:

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

Gli articoli devono essere rimossi al contrario, altrimenti si verificherà un errore. Inoltre, non ho raccomandato semplicemente di impostare i valori su null, poiché ciò potrebbe causare comportamenti imprevisti.

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

O se preferisci, puoi renderlo una funzione:

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

Il codice sopra la risposta richiede una leggera modifica per rimuovere l'elenco completo, si prega di controllare questo pezzo di codice.

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

aggiorna la lunghezza e rimuoverà tutti i dati dall'elenco a discesa. Spero che questo possa aiutare qualcuno.


Bella aggiunta - per un attimo è rimasto sconcertato sul perché non rimuovesse tutte le opzioni ogni volta.
— Ralpharoo,

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

0

Se devi supportare IE e hai più di 100 articoli nel tuo elenco di selezione, ti consiglio vivamente di considerare di sostituire la selezione con una funzione come questa:

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

Il parametro select dovrebbe essere l'elemento da un selettore jquery o da document.getElementBy call. L'unico aspetto negativo di questo è che si perdono gli eventi che erano stati collegati alla selezione, ma è possibile ricollegarli facilmente quando viene ripristinata la funzione. Stavo lavorando con una selezione che aveva ~ 3k elementi e ci sarebbero voluti 4 secondi su IE9 per cancellare la selezione in modo da poterlo aggiornare con il nuovo contenuto. Quasi istantaneamente farlo in questo modo.


Puoi trovare maggiori informazioni qui: somacon.com/p542.php e un modo più semplice:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
— FDisk,

0

Per Vanilla JavaScript esiste un modo semplice ed elegante per farlo:

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

-1

Oggi stavo affrontando lo stesso problema, ho fatto come di seguito mentre ricarico la casella di selezione. (In Plain 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);

        }

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.