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.


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

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!


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

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 = "";

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

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.


Pas le plus court, voir ma réponse ci-dessous.
utilisateur

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

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.


11

C'est un JavaScript un peu moderne et pur

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


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

7

avec PrototypeJS :

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

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.


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.


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


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>


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

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



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>


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

1
var select = document.getElementById('/*id attribute of your select here*/');
for (var option in select){
    select.remove(option);
}

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.


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

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.


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

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

        }

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.