¿Cómo borro todas las opciones en un cuadro desplegable?

153

Mi código funciona en IE pero se rompe en Safari, Firefox y Opera. (gran sorpresa)

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

Después de buscar, aprendí que es lo length=0que no le gusta.
Lo he intentado ...options=nully var clear=0; ...length=clearcon el mismo resultado.

Estoy haciendo esto a varios objetos a la vez, así que estoy buscando un código JS ligero.

Kirt
fuente
Para destruir todas las opciones (!?) Y restablecer el historial del navegador de las opciones seleccionadas después de actualizar la página, para usar el HTML <option selected>?? (Google nos puso aquí pero no está aquí) ... Vea la solución real document.getElementById ("form1"). reset () .
Peter Krauss

Respuestas:

34

Puede usar lo siguiente para borrar todos los elementos.

var select = document.getElementById("DropList");
var length = select.options.length;
for (i = length-1; i >= 0; i--) {
  select.options[i] = null;
}
Nick Craver
fuente
14
MooTools también tiene empty() , por lo que lo harían$("DropList").empty();
Brian Koser
42
Esto parece una mala idea: establecer los elementos en nulo no es lo mismo que eliminarlos.
9
Tampoco funciona como se esperaba. Cuando uso ese código, deja un objeto en el menú desplegable.
gabrjan
9
Este código puede fallar. La forma más segura de ejecutar el ciclo en reversa.
Kangkan
19
Verifique las otras respuestas para una mejor manera de hacer esto.
Tim Cavanaugh el
296

Para eliminar las opciones de un elemento HTML de select, puede utilizar el 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'));

Es importante eliminar el al optionsrevés; como elremove() método reorganiza la optionscolección. De esta manera, ¡se garantiza que el elemento a eliminar aún existe!

Fabiano
fuente
9
Saludos para ese @Fabiano, esto en realidad elimina los elementos en lugar de otras sugerencias.
Constanta
44
la clave aquí es el recorrido hacia atrás de las opciones de selectbox. Creo que ... esta solución falló cuando intenté el recorrido hacia adelante
scottysseus
77
Sí, fallará porque el método remove () reorganizará la matriz. Hacerlo al revés garantizará que exista el elemento a eliminar.
Fabiano
Agregar selectbox.options.length = 0; al final de la definición podría hacerlo perfecto en todos los navegadores.
omkar sirra
44
El código simple es mientras (selectEl.options.length) selectEl.options.remove (0)
MiF
127

Si desea tener un script ligero, entonces elija jQuery. En jQuery, la solución para eliminar todas las opciones será como:

$("#droplist").empty();
Kangkan
fuente
46
Yo diría que el acto mismo de agregar jQuery es lo opuesto a "ligero" cuando for (a in select.options) { select.options.remove(0); }funciona bien.
Artog
77
Depende del contexto. En una aplicación web, la legibilidad de cien líneas de $("#droplist").empty();código de tipo en comparación con miles de líneas de JS de vainilla hacen que valga la pena agregar jQuery. Si estamos hablando de marcado / cosméticos para una página web simple, estás 100% correcto.
Half_Duplex
3
@AdamIngmansson Me resulta desconcertante cuando las personas denigran el uso de JQuery. Usaría un método como este suponiendo que los ingenieros detrás de JQ han realizado todo tipo de pruebas para encontrar el mejor, el más rápido y, sobre todo, el más confiable medio para realizar una tarea (de utilidad) determinada. El objetivo de JQ (o cualquier buena biblioteca) es asumir las tareas mundanas para que pueda concentrarse en las cosas interesantes.
Mike roedor
2
@mikerodent No tengo dudas de que la función en sí es de alta calidad y rendimiento. Pero cargar un archivo de 86kb (la biblioteca comprimida de la versión 3.2.1) solo para esa pequeña función no es 'liviano' :) Por supuesto, si utiliza muchas de las otras funciones, valdrá la pena usar jQuery. Es una muy buena biblioteca
Artog
1
@AdamIngmansson ¡Bastante justo! Pero supongo que sabe que el archivo JQ min.js se usa con tanta frecuencia que se encuentra muy a menudo en la memoria caché de un navegador. En tal medida que probablemente haya un buen argumento para decir "siempre use JQ y considere NO usarlo como parte de una etapa de optimización, SI esto realmente resulta necesario". Posiblemente pueda resultar necesario en ciertos contextos (aplicaciones de teléfono, etc.) ... esto está más allá de mi miserable conocimiento de JS.
Mike roedor
105

Probablemente, no sea la solución más limpia, pero definitivamente es más simple que eliminar uno por uno:

document.getElementById("DropList").innerHTML = "";
Dmitry Shintyakov
fuente
Por lo general, evito innertHTML como la peste. Pero esto hace las cosas mucho más simples que realmente me gustan.
petersaints
No pude hacer que esto funcione. No estoy seguro de por qué no borra las opciones de selección de esta manera.
MikaelL
@MikaelL, es útil si agrega en qué navegador sucede. Y su versión, si lo recuerda.
usuario
70

Esta es la mejor manera :

function (comboBox) {
    while (comboBox.options.length > 0) {                
        comboBox.remove(0);
    }        
}
Rodrigo Longo
fuente
Esto me salvó hoy, porque el mecanismo 'for () {selectbox.remove ()}' de alguna manera no borra todas las opciones. Gracias.
sonlexqt
44
un poco más corto comowhile (comboBox.options.length) comboBox.remove(0);
EkriirkE
31

Este es un camino corto:

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

Una línea, no para, no JQuery, simple.

Bomberos26
fuente
No es el más corto, mira mi respuesta a continuación.
usuario
16
function removeOptions(obj) {
    while (obj.options.length) {
        obj.remove(0);
    }
}
Julio García
fuente
1
Esta solución es la única que funciona para mí. Iceweasel 10.0.12 y Chrome 26.
davide
16

Me gustaría señalar que el problema en la pregunta original ya no es relevante hoy. Y hay una versión aún más corta de esa solución:

selectElement.length = 0;

He probado que ambas versiones funcionan en Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, las últimas versiones de Chrome, Firefox, Samsung Internet y UC Browser en Android, Safari en iPhone 6S, Android 4.2. 2 navegador de valores. Creo que es seguro concluir que es absolutamente compatible con cualquier dispositivo que haya en este momento, por lo que recomiendo este enfoque.

usuario
fuente
11

Este es un JavaScript un poco moderno y puro

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

a_rahmanshah
fuente
1
Código más rápido Para probar, intente eliminar aproximadamente 250000 opciones
Andrej
7

con PrototypeJS :

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

Si está utilizando JQuery y su control de selección tiene ID "DropList", puede eliminar sus opciones de esta manera:

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

En realidad, me funciona con cualquier lista de opciones, como datalist.

Espero eso ayude.

norgematos
fuente
55
Una buena respuesta debe contener más detalles que esto. El lector puede no tener idea de que probablemente te refieres a jQuery.
Mifeet
55
@Mifeet si el usuario no tiene idea de lo que JQuery quiere decir aquí, él / ella debería cambiar de carrera
Emilio Gort
6

Tenga en cuenta que una selección puede tener tanto la
colección optgroup como las
opciones
como elementos secundarios .

Entonces,

Método 1

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

Método 2

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

Probé, ambos funcionan en Chrome.
Me gusta el método # 1 más simple y anticuado.

Manohar Reddy Poreddy
fuente
1
Esta es la mejor respuesta. Además, si ya tiene una referencia jquery a select:$select.html('')
the_nuts el
5

Tratar

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

O tal vez busque en la función removeChild ().

O si usas jQuery framework.

$("DropList Option").each(function(){$(this).remove();});
Tormenta de afeitar
fuente
4

¡Usar JQuery es una forma más bonita, corta e inteligente de hacerlo!

$('#selection_box_id').empty();
Sobin Sunny
fuente
1
Esto es realmente solo una repetición de esta respuesta existente .
Pang
4

Esto se puede usar para borrar opciones:

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
fuente
3

Ir en reversa. La razón es que el tamaño disminuye después de cada eliminación.

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

Espero, este código te ayudará

Nitika Chopra
fuente
2

Creo que es el mejor sol. es

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

Ossama Zakaria
fuente
2

Las soluciones más simples son las mejores, por lo que solo necesita:

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
fuente
2

Los elementos deben eliminarse a la inversa, de lo contrario, se producirá un error. Además, no recomiendo simplemente establecer los valores en null, ya que eso puede causar un comportamiento inesperado.

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

O si lo prefiere, puede hacerlo una función:

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

El código de la respuesta anterior necesita un ligero cambio para eliminar la lista completa, verifique este fragmento 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;
}

actualice la longitud y eliminará todos los datos de la lista desplegable. Espero que esto ayude a alguien.

Sin nombre
fuente
Buena adición: se quedó perplejo por un momento sobre por qué no eliminaba todas las opciones cada vez.
Ralpharoo
0
while(document.getElementById("DropList").childNodes.length>0) 
{
    document.getElementById("DropList").removeChild(document.getElementById("DropList").childNodes[0]);
}
usuario1910893
fuente
0

Si tiene que admitir IE y tiene más de 100 elementos en su lista de selección, le recomiendo que considere reemplazar la selección con una función como esta:

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

El parámetro select debe ser el elemento de un selector jquery o de la llamada document.getElementBy. El único inconveniente de esto es que pierde los eventos que había conectado a la selección, pero puede volver a conectarlos fácilmente cuando se devuelve de la función. Estaba trabajando con una selección que tenía ~ 3k elementos y me tomaría 4 segundos en IE9 borrar la selección para poder actualizarla con el nuevo contenido. Casi instantáneo haciéndolo de esta manera.

Dan
fuente
Puede encontrar más información aquí: somacon.com/p542.php y de manera más simple:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
FDisk
0

Para Vanilla JavaScript hay una manera simple y elegante de hacer esto:

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

Hoy estaba enfrentando el mismo problema, hice lo siguiente mientras recargaba el cuadro de selección. (En llano 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
fuente
-2
var select =$('#selectbox').val();
usuario3767285
fuente
1
Deberías ser más descriptivo en tu respuesta
Krupa Patel