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.