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.

Kirt
fonte
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;
}
Nick Craver
fonte
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!

Fabiano
fonte
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();
Kangkan
fonte
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 = "";
Dmitry Shintyakov
fonte
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);
    }        
}
Rodrigo Longo
fonte
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
31

Esta é uma maneira curta:

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

Uma linha, sem, sem JQuery, simples.

Bombeiros26
fonte
Não é o mais curto, veja minha resposta abaixo.
usuário
16
function removeOptions(obj) {
    while (obj.options.length) {
        obj.remove(0);
    }
}
Julio Garcia
fonte
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.

do utilizador
fonte
11

Este é um pouco de JavaScript moderno e puro

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

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

com PrototypeJS :

$('yourSelect').select('option').invoke('remove');
EpokK
fonte
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.

norgematos
fonte
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.

Manohar Reddy Poreddy
fonte
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();});
Tempestade de Navalha
fonte
4

Usar o JQuery é uma maneira mais bonita, mais curta e inteligente de fazer isso!

$('#selection_box_id').empty();
Sobin Sunny
fonte
1
Esta é realmente apenas uma repetição desta resposta existente .
Pang
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>

Vichu
fonte
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);
}
Dinesh Khetarpal
fonte
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

Nitika Chopra
fonte
2

Eu acho que é o melhor sol. é

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

Ossama Zakaria
fonte
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>

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

NoNaMe
fonte
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]);
}
user1910893
fonte
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.

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

        }
CHowdappaM
fonte
-2
var select =$('#selectbox').val();
user3767285
fonte
1
Você deve ser mais descritivo em sua resposta
Krupa Patel