Comment effacer toutes les options d'une liste déroulante?

153

Mon code fonctionne dans IE mais se rompt dans Safari, Firefox et Opera. (grosse surprise)

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

Après avoir cherché, j'ai appris que c'est length=0ça qu'il n'aime pas.
J'ai essayé ...options=nullet var clear=0; ...length=clearavec le même résultat.

Je fais cela à plusieurs objets à la fois, donc je recherche du code JS léger.

Kirt
la source
Pour détruire toutes les options (!?), Et à propos de réinitialiser l'historique des options sélectionnées du navigateur après l'actualisation de la page, utiliser le HTML <option selected>?? (google nous a mis ici mais ce n'est pas ici) ... Voir document.getElementById ("form1"). reset () vraie solution.
Peter Krauss

Réponses:

34

Vous pouvez utiliser ce qui suit pour effacer tous les éléments.

var select = document.getElementById("DropList");
var length = select.options.length;
for (i = length-1; i >= 0; i--) {
  select.options[i] = null;
}
Nick Craver
la source
14
MooTools a également empty(), alors vous le feriez$("DropList").empty();
Brian Koser
42
Cela semble être une mauvaise idée - définir les éléments sur null n'est pas la même chose que les supprimer.
9
Cela ne fonctionne pas non plus comme prévu. Lorsque j'utilise ce code, il laisse un objet dans la liste déroulante.
gabrjan
9
Ce code pourrait planter. Le moyen le plus sûr d'exécuter la boucle en sens inverse.
Kangkan
19
Vérifiez les autres réponses pour une meilleure façon de le faire.
Tim Cavanaugh
296

Pour supprimer les options d'un élément HTML de select, vous pouvez utiliser la remove()méthode:

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

Il est important de supprimer le optionsdos; car la remove()méthode réorganise la optionscollection. De cette façon, il est garanti que l'élément à supprimer existe toujours!

Fabiano
la source
9
bravo pour cela @Fabiano, cela supprime en fait les éléments par opposition à d'autres suggestions.
Constanta
4
la clé ici est la traversée vers l'arrière de la selectbox.options je pense .... cette solution a échoué lorsque j'ai essayé la traversée vers l'avant
scottysseus
7
Oui, cela échouera car la méthode remove () réorganisera le tableau. Le faire à l'envers garantira que l'élément à supprimer existera.
Fabiano
Ajout de selectbox.options.length = 0; à la fin de la définition pourrait le rendre parfait dans tous les navigateurs.
omkar sirra le
4
Le code simple est while (selectEl.options.length) selectEl.options.remove (0)
MiF
127

Si vous souhaitez avoir un script léger, optez pour jQuery. Dans jQuery, la solution pour supprimer toutes les options sera comme:

$("#droplist").empty();
Kangkan
la source
47
Je dirais que l'acte même d'ajouter jQuery est l'opposé de «léger» quand for (a in select.options) { select.options.remove(0); }le travail fonctionne très bien.
Artog
7
Ça dépend du contexte. Dans une application web, la lisibilité d'une centaine de lignes de $("#droplist").empty();type code par rapport à des milliers de lignes de vanilla JS vaut largement l'ajout de jQuery. Si nous parlons de balisage / cosmétiques pour une simple page Web, vous avez 100% raison.
Half_Duplex
3
@AdamIngmansson Je trouve cela déroutant quand les gens dénigrent l'utilisation de JQuery. J'utiliserais une méthode comme celle-ci en supposant que les ingénieurs derrière JQ ont fait toutes sortes de tests pour trouver le moyen le meilleur, le plus rapide et surtout le plus fiable pour effectuer une tâche (utilitaire) donnée. Le but de JQ (ou de toute bonne bibliothèque) est de prendre en charge les tâches banales afin que vous puissiez vous concentrer sur les choses intéressantes.
mike rodent
2
@mikerodent Je suis convaincu que la fonction elle-même est de qualité et de performances optimales. Mais charger un fichier de 86 ko (la bibliothèque compressée de la version 3.2.1) juste pour cette petite fonction n'est pas «léger» :) Bien sûr, si vous utilisez beaucoup d'autres fonctionnalités, cela vaudra la peine d'utiliser jQuery. C'est une très bonne bibliothèque
Artog
1
@AdamIngmansson Très bien! Mais je suppose que vous savez que le fichier JQ min.js est utilisé si souvent qu'il se trouve très souvent dans le cache d'un navigateur. À tel point qu'il y a probablement un bon argument pour dire "utilisez toujours JQ et ne considérez PAS l'utiliser comme faisant partie d'une étape d'optimisation, SI cela s'avère vraiment nécessaire". Cela peut en effet s'avérer nécessaire dans certains contextes (applications téléphoniques, etc.) ... cela dépasse mes connaissances dérisoires JS.
mike rodent
105

Ce n'est probablement pas la solution la plus propre, mais c'est certainement plus simple que de supprimer un par un:

document.getElementById("DropList").innerHTML = "";
Dmitry Shintyakov
la source
J'évite généralement innertHTML comme la peste. Mais cela rend les choses tellement plus simples que je l'aime vraiment.
petersaints
Je n'ai pas pu faire fonctionner ça. Je ne sais pas pourquoi cela n'efface pas les options de sélection de cette façon.
MikaelL
@MikaelL, c'est utile si vous ajoutez dans quel navigateur il se déroule. Et sa version, si vous vous en souvenez.
utilisateur
70

C'est la meilleur façon :

function (comboBox) {
    while (comboBox.options.length > 0) {                
        comboBox.remove(0);
    }        
}
Rodrigo Longo
la source
Cela m'a sauvé aujourd'hui, car le mécanisme 'for () {selectbox.remove ()}' ne supprime pas toutes les options. Merci.
sonlexqt
4
légèrement plus court quewhile (comboBox.options.length) comboBox.remove(0);
EkriirkE
32

C'est un chemin court:

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

Une ligne, non pour, pas de JQuery, simple.

Pompiers26
la source
Pas le plus court, voir ma réponse ci-dessous.
utilisateur
16
function removeOptions(obj) {
    while (obj.options.length) {
        obj.remove(0);
    }
}
Julio Garcia
la source
1
Cette solution est la seule qui fonctionne pour moi. Iceweasel 10.0.12 et Chrome 26.
davide
16

Je tiens à souligner que le problème de la question initiale n'est plus pertinent aujourd'hui. Et il existe une version encore plus courte de cette solution:

selectElement.length = 0;

J'ai testé que les deux versions fonctionnent dans Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, les dernières versions de Chrome, Firefox, Samsung Internet et UC Browser sur Android, Safari sur iPhone 6S, Android 4.2. 2 navigateur de stock. Je pense qu'il est prudent de conclure qu'il est absolument compatible avec n'importe quel appareil existant actuellement, je recommande donc cette approche.

utilisateur
la source
11

C'est un JavaScript un peu moderne et pur

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

a_rahmanshah
la source
1
Code le plus rapide. Pour les tests, essayez de supprimer environ 250000 options
Andrej
7

avec PrototypeJS :

$('yourSelect').select('option').invoke('remove');
EpokK
la source
6

Si vous utilisez JQuery et que votre contrôle de sélection a l'ID "DropList", vous pouvez supprimer ses options en procédant de cette façon:

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

En fait, cela fonctionne pour moi avec n'importe quelle liste d'options, comme datalist.

J'espère que ça aide.

norgematos
la source
5
Une bonne réponse devrait contenir plus de détails que cela. Le lecteur n'a peut-être aucune idée que vous voulez probablement dire jQuery.
Mifeet
5
@Mifeet si l'utilisateur n'a aucune idée de ce que signifie JQuery ici, il / elle devrait changer de carrière
Emilio Gort
6

Notez qu'une sélection peut avoir à la fois la collection
- optgroup &
- options
comme enfants.

Alors,

Méthode n ° 1

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

Méthode n ° 2

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

J'ai testé, les deux fonctionnent sur Chrome.
J'aime la méthode n ° 1 la plus simple et à l'ancienne.

Manohar Reddy Poreddy
la source
1
C'est la meilleure réponse. Aussi, si vous avez déjà une référence jquery à la sélection:$select.html('')
the_nuts
5

Essayer

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

Ou peut-être regardez dans la fonction removeChild ().

Ou si vous utilisez le framework jQuery.

$("DropList Option").each(function(){$(this).remove();});
Razor Storm
la source
4

Utiliser JQuery est un moyen plus joli, plus court et plus intelligent de le faire!

$('#selection_box_id').empty();
Sobin Sunny
la source
1
Ce n'est vraiment qu'une répétition de cette réponse existante .
Pang
4

Cela peut être utilisé pour effacer les options:

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
la source
3

Faites marche arrière. La raison est que la taille diminue après chaque suppression.

for (i = (len-1); i > -1; i--) {
    document.getElementById("elementId").remove(i);
}
Dinesh Khetarpal
la source
3
var select = document.getElementById("DropList");
var length = select.options.length;
for (i = 0; i < length; i++) {
  select.options[i].remove();
}

J'espère que ce code vous aidera

Nitika Chopra
la source
2

Je pense que c'est le meilleur sol. est

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

Ossama Zakaria
la source
2

Les solutions les plus simples sont les meilleures, il vous suffit donc de:

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
la source
2

Les éléments doivent être supprimés à l'envers, sinon cela provoquera une erreur. En outre, je ne recommande pas simplement de définir les valeurs sur null, car cela peut provoquer un comportement inattendu.

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

Ou si vous préférez, vous pouvez en faire une fonction:

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
la source
1
var select = document.getElementById('/*id attribute of your select here*/');
for (var option in select){
    select.remove(option);
}
kyllo
la source
1

Le code de la réponse ci-dessus nécessite une légère modification pour supprimer la liste complète, veuillez vérifier ce morceau de code.

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

actualiser la longueur et il supprimera toutes les données de la liste déroulante. J'espère que cela aidera quelqu'un.

Sans nom
la source
Bel ajout - a été perplexe pendant un moment sur la raison pour laquelle il ne supprimait pas toutes les options à chaque fois.
Ralpharoo
0
while(document.getElementById("DropList").childNodes.length>0) 
{
    document.getElementById("DropList").removeChild(document.getElementById("DropList").childNodes[0]);
}
user1910893
la source
0

Si vous devez prendre en charge IE et que vous avez plus de 100 éléments dans votre liste de sélection, je vous recommande fortement d'envisager de remplacer la sélection par une fonction comme celle-ci:

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

Le paramètre select doit être l'élément issu d'un appel jquery selector ou document.getElementBy. Le seul inconvénient est que vous perdez les événements que vous aviez câblés à la sélection, mais vous pouvez facilement les rattacher lorsqu'ils sont renvoyés hors de la fonction. Je travaillais avec une sélection qui avait ~ 3k éléments et il faudrait 4 secondes sur IE9 pour effacer la sélection afin que je puisse la mettre à jour avec le nouveau contenu. Presque instantanément le faire de cette façon.

Dan
la source
Vous pouvez trouver plus d'informations ici: somacon.com/p542.php et de manière plus simple:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
FDisk
0

Pour Vanilla JavaScript, il existe un moyen simple et élégant de le faire:

for(var o of document.querySelectorAll('#DropList > option')) {
  o.remove()
}
Piotr
la source
-1

Aujourd'hui, je faisais face au même problème, j'ai fait comme ci-dessous en rechargeant la boîte de sélection. (En clair 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
la source
-2
var select =$('#selectbox').val();
user3767285
la source
1
Vous devriez être plus descriptif sur votre réponse
Krupa Patel