Como limpo todas as opções em uma caixa suspensa?


153

Meu código funciona no IE, mas quebra no Safari, Firefox e Opera. (grande surpresa)

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

Depois de pesquisar, aprendi que é o length=0que não gosta.
Eu tentei ...options=nulle var clear=0; ...length=clearcom o mesmo resultado.

Estou fazendo isso com vários objetos ao mesmo tempo, por isso estou procurando algum código JS leve.


Para destruir todas as opções (!?), E sobre redefinir o histórico do navegador das opções selecionadas após atualizar a página, para usar o HTML <option selected>? (o Google nos colocou aqui, mas não está aqui) ... Consulte a solução real document.getElementById ("form1"). reset () .
Peter Krauss

Respostas:


34

Você pode usar o seguinte para limpar todos os elementos.

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

14
MooTools também tem empty(), então você faria$("DropList").empty();
Brian Koser 12/12/12

42
Parece uma péssima idéia - definir os itens como nulos não é o mesmo que removê-los.

9
Também não funciona como esperado. Quando eu uso esse código, deixa um objeto no menu suspenso.
Gabrjan

9
Este código pode falhar. A maneira mais segura de executar o loop ao contrário.
Kangkan

19
Verifique as outras respostas para uma maneira melhor de fazer isso.
Tim Cavanaugh

296

Para remover as opções de um elemento HTML de select, você pode utilizar o remove()método:

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 remover o optionscontrário; como o remove()método reorganiza a optionscoleção. Dessa forma, é garantido que o elemento a ser removido ainda exista!


9
aplausos por @Fabiano, isso remove os itens, por oposição a outras sugestões.
Constanta

4
a chave aqui é a passagem para trás do selectbox.options eu acho .... essa solução falhou quando tentei avançar pela passagem
scottysseus

7
Sim, falhará porque o método remove () reorganizará a matriz. Se fizer isso ao contrário, garantirá a existência do elemento a ser removido.
Fabiano

Adicionando selectbox.options.length = 0; no final da definição, pode ser perfeito em todos os navegadores.
Sirra omkar

4
O código simples é while (selectEl.options.length) selectEl.options.remove (0)
MiF

127

Se você deseja ter um script leve, vá para o jQuery. No jQuery, a solução para remover todas as opções será:

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

46
Eu diria que o próprio ato de adicionar jQuery é o oposto de "leve" quando for (a in select.options) { select.options.remove(0); }o trabalho é bom.
11234 Artog

7
Depende do contexto. Em um aplicativo da Web, a legibilidade de cem linhas de $("#droplist").empty();código de tipo em comparação com milhares de linhas de JS vanilla faz valer a pena a adição do jQuery. Se estamos falando de marcação / cosméticos para uma página da web simples, você está 100% correto.
precisa saber é o seguinte

3
@AdamIngmansson Acho desconcertante quando as pessoas denegrem o uso do JQuery. Eu usaria um método como esse pressupondo que os engenheiros por trás da JQ fizeram todos os tipos de testes para encontrar os melhores, mais rápidos e, acima de tudo, os mais confiáveis ​​meios de realizar uma determinada tarefa (utilidade). O objetivo do JQ (ou qualquer boa biblioteca) é assumir as tarefas mundanas para que você possa se concentrar nas coisas interessantes.
mike roedor

2
@mikerodent Não tenho dúvidas de que a função em si é de alta qualidade e desempenho. Mas carregar um arquivo de 86kb (a lib compactada da versão 3.2.1) apenas para essa pequena função não é 'leve' :) Obviamente, se você usa muitas outras funcionalidades, vale a pena usar o jQuery. É uma biblioteca muito boa
Artog

1
@AdamIngmansson Fair suficiente! Mas suponho que você saiba que o arquivo min.js. do JQ é usado com tanta frequência que é frequentemente encontrado no cache do navegador. A tal ponto que provavelmente há um bom argumento para dizer "sempre use JQ e considere NÃO usá-lo como parte de um estágio de otimização, SE isso realmente for necessário". Pode ser necessário em certos contextos (aplicativos de telefone etc.) ... isso está além do meu conhecimento sobre JS.
mike roedor

105

Provavelmente, não é a solução mais limpa, mas é definitivamente mais simples do que remover um por um:

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

Eu costumo evitar HTML inerte como a praga. Mas isso torna as coisas muito mais simples que eu realmente gosto.
petersaints

Não consegui fazer isso funcionar. Não sei por que não desmarca as opções selecionadas dessa maneira.
MikaelL 10/02

@MikaelL, é útil se você adicionar em qual navegador ele acontece. E sua versão, se você se lembra.
usuário

70

Esta é a melhor maneira:

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

Isso me salvou hoje, porque o mecanismo 'for () {selectbox.remove ()}' de alguma forma não limpa todas as opções. Obrigado.
sonlexqt

4
ligeiramente mais curto comowhile (comboBox.options.length) comboBox.remove(0);
EkriirkE


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

1
Esta solução é a única que funciona para mim. Iceweasel 10.0.12 e Chrome 26.
davide

16

Gostaria de salientar que o problema na pergunta original não é mais relevante hoje. E há uma versão ainda mais curta dessa solução:

selectElement.length = 0;

Testei que ambas as versões funcionam no Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, versões mais recentes do Chrome, Firefox, Samsung Internet e UC Browser no Android, Safari no iPhone 6S, Android 4.2. 2 navegador de ações. Eu acho que é seguro concluir que é absolutamente compatível com qualquer dispositivo existente no momento, por isso recomendo essa abordagem.


11

Este é um pouco de JavaScript moderno e puro

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


1
Código mais rápido. Para testar, tente remover cerca de 250000 opções
Andrej

7

com PrototypeJS :

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

6

Se você estiver usando JQuery e seu controle de seleção tiver o ID "DropList", você poderá remover suas opções da seguinte maneira:

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

Na verdade, ele funciona para mim com qualquer lista de opções, como datalist.

Espero que ajude.


5
Uma boa resposta deve conter mais detalhes do que isso. O leitor pode não ter idéia de que você provavelmente quer dizer jQuery.
Mifeet

5
@Mifeet se o usuário não tem nenhuma idéia do que JQuery significa aqui, ele / ela deve mudar de carreira
Emilio Gort

6

Observe que um select pode ter as duas
coleções - optgroup &
- options
como seus filhos.

Assim,

Método 1

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

Método # 2

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

Eu testei, ambos funcionam no Chrome.
Gosto do método mais simples e antiquado nº 1.


1
Esta é a melhor resposta. Além disso, se você já tiver uma referência jQuery para o select:$select.html('')
the_nuts

5

Experimentar

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

Ou talvez veja a função removeChild ().

Ou se você usa a estrutura jQuery.

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


4

Isso pode ser usado para limpar as opções:

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

Vá para trás. A razão é que o tamanho diminui após cada remoção.

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

Espero que este código o ajude



2

As soluções mais simples são as melhores, então você só precisa 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

Os itens devem ser removidos ao contrário, caso contrário, causará um erro. Além disso, não recomendo simplesmente definir os valores nullcomo, pois isso pode causar um comportamento inesperado.

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

Ou, se preferir, você pode torná-lo uma função:

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

O código da resposta acima precisa de uma pequena alteração para remover a lista completa. Verifique este trecho de código.

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

atualize o comprimento e removerá todos os dados da lista suspensa. Espero que isso ajude alguém.


Adição agradável - ficou perplexo por um momento porque não estava removendo todas as opções de cada vez.
Ralpharoo

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

0

Se você precisar oferecer suporte ao IE e tiver mais de 100 itens em sua lista de seleção, recomendo fortemente que você substitua o select por uma função da seguinte maneira:

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

O parâmetro select deve ser o elemento de um seletor de jquery ou chamada de document.getElementBy. A única desvantagem disso é que você perde os eventos que você havia ligado até o select, mas pode facilmente anexá-los novamente à medida que ele volta à função. Eu estava trabalhando com um select que tinha ~ 3k itens e levaria 4 segundos no IE9 para limpar o select para que eu pudesse atualizá-lo com o novo conteúdo. Quase instantaneamente fazê-lo dessa maneira.


Você pode encontrar mais informações aqui: somacon.com/p542.php e de maneira mais simples:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
FDisk

0

Para o Vanilla JavaScript, existe uma maneira simples e elegante de fazer isso:

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

-1

Hoje eu estava enfrentando o mesmo problema, fiz como abaixo ao recarregar a caixa de seleção. (Na planície 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);

        }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.