¿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.


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

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!


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

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

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

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.


No es el más corto, mira mi respuesta a continuación.
usuario

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

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.


11

Este es un JavaScript un poco moderno y puro

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


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

7

con PrototypeJS :

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

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.


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.


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


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>


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

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á



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>


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

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

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.


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

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.


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

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

        }

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.