Как очистить все параметры в раскрывающемся списке?


153

Мой код работает в IE, но ломается в Safari, Firefox и Opera. (большой сюрприз)

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

После поиска я узнал, что это то, length=0что ему не нравится.
Я пробовал ...options=nullи var clear=0; ...length=clearс тем же результатом.

Я делаю это для нескольких объектов одновременно, поэтому я ищу легкий код JS.


Чтобы уничтожить все параметры (!?), А также сбросить в браузере историю выбранных параметров после обновления страницы, использовать HTML- <option selected>коды ?? (Google разместил нас здесь, но это не здесь) ... См. document.getElementById ("form1"). reset () реальное решение.
Питер Краусс

Ответы:


34

Вы можете использовать следующее, чтобы очистить все элементы.

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

14
MooTools также имеет empty(), так что вы бы сделали$("DropList").empty();
Брайан Козер

42
Это кажется плохой идеей - установка элементов в null - это не то же самое, что удаление их.

9
Это также не работает, как ожидалось. Когда я использую этот код, он оставляет один объект в раскрывающемся списке.
gabrjan

9
Этот код может дать сбой. Самый безопасный способ запустить цикл в обратном порядке.
Канкан

19
Проверьте другие ответы для лучшего способа сделать это.
Тим Кавано

296

Чтобы удалить параметры HTML-элемента select, вы можете использовать remove()метод:

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

Важно убрать optionsзадом наперед; как remove()метод переупорядочивает optionsколлекцию. Таким образом, гарантируется, что удаляемый элемент все еще существует!


9
ура за это @Fabiano, это на самом деле удаляет элементы, в отличие от других предложений.
Констанца

4
ключ здесь - обратный обход selectbox.options, я думаю .... это решение не сработало, когда я попытался
пройти

7
Да, это не удастся, потому что метод remove () переставит массив. Выполнение этого в обратном направлении гарантирует, что удаляемый элемент будет существовать.
Фабиано

Добавление selectbox.options.length = 0; в конце определения может сделать его идеальным во всех браузерах.
Омкар Сирра

4
Простой код пока (selectEl.options.length) selectEl.options.remove (0)
MiF

127

Если вы хотите иметь легкий скрипт, то перейдите на jQuery. В jQuery решение для удаления всех опций будет таким:

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

47
Я бы сказал, что само добавление jQuery является противоположностью «легковесности», когда for (a in select.options) { select.options.remove(0); }все работает просто отлично.
Артог

7
Это зависит от контекста. В веб-приложении читаемость сотен строк $("#droplist").empty();кода типа по сравнению с тысячами строк ванильного JS делает его достойным добавления jQuery. Если мы говорим о разметке / косметике для простой веб-страницы, вы на 100% правы.
Half_Duplex

3
@AdamIngmansson Мне кажется странным, когда люди клеветают на использование JQuery. Я бы использовал такой метод, исходя из предположения, что инженеры JQ провели всевозможные тесты, чтобы найти лучший, самый быстрый и, прежде всего, самый надежный способ выполнения данной (полезной) задачи. Смысл JQ (или любой хорошей библиотеки) в том, чтобы взять на себя повседневные задачи, чтобы вы могли сосредоточиться на интересных вещах.
Майк Грызун

2
@Mikerodent Я не сомневаюсь, что сама функция имеет высокое качество и производительность. Но загрузка файла размером 86 КБ (сжатая библиотека версии 3.2.1) только для этой маленькой функции не является «легкой» :) Конечно, если вы используете многие другие функции, то стоит использовать jQuery. Это очень хорошая библиотека
Артог

1
@ AdamIngmansson Достаточно справедливо! Но я полагаю, вы знаете, что файл JQ min.js используется так часто, что очень часто находится в кэше браузера. В такой степени, что, вероятно, есть хороший аргумент для высказывания «всегда используйте JQ и не используйте его как часть этапа оптимизации, ЕСЛИ это действительно необходимо». Это может действительно оказаться необходимым в определенных контекстах (телефонные приложения и т. Д.) ... это за пределами моего мизерного знания JS.
Майк Грызун

105

Возможно, не самое чистое решение, но оно определенно проще, чем удаление по одному:

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

Я обычно избегаю innertHTML как чума. Но это делает вещи намного проще, и мне это действительно нравится.
petersaints

Я не мог заставить это работать. Не уверен, почему не очищает выбранные параметры таким образом.
MikaelL

@MikaelL, это полезно, если вы добавите, в каком браузере это происходит. И его версию, если вы помните.
пользователь

70

Это лучший способ:

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

Это спасло меня сегодня, потому что механизм 'for () {selectbox.remove ()}' почему-то не очищает все опции. Спасибо.
sonlexqt

4
немного короче какwhile (comboBox.options.length) comboBox.remove(0);
EkriirkE


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

1
Это единственное решение, которое работает для меня. Iceweasel 10.0.12 и Chrome 26.
Давид

16

Я хотел бы отметить, что проблема в первоначальном вопросе больше не актуальна сегодня. И есть еще более короткая версия этого решения:

selectElement.length = 0;

Я проверял, что обе версии работают в Firefox 52, Chrome 49, Opera 36, ​​Safari 5.1, IE 11, Edge 18, последних версиях Chrome, Firefox, Samsung Internet и UC Browser на Android, Safari на iPhone 6S, Android 4.2. 2 сток браузер. Я думаю, что можно с уверенностью заключить, что он абсолютно совместим с любым устройством, которое есть сейчас, поэтому я рекомендую этот подход.


11

Это немного современный и чистый JavaScript

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


1
Самый быстрый код. Для тестирования попробуйте удалить около 250000 вариантов
Андрей


6

Если вы используете JQuery и ваш элемент управления имеет идентификатор «DropList», вы можете удалить его параметры следующим образом:

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

На самом деле это работает для меня с любым списком опций, как datalist.

Надеюсь, поможет.


5
Хороший ответ должен содержать больше деталей, чем этот. Читатель может и не догадываться, что вы, вероятно, имеете в виду jQuery.
Мифит

5
@Mifeet, если пользователь понятия не имеет, что здесь означает JQuery, ему следует сменить карьеру
Эмилио Горт

6

Обратите внимание, что
выборка может иметь обе коллекции - optgroup &
- options
как свои дочерние элементы .

Так,

Способ № 1

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

Способ № 2

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

Я проверял, оба работают на Chrome.
Мне нравится более простой, старомодный, метод № 1.


1
Это лучший ответ. Кроме того, если у вас уже есть ссылка jquery на select:$select.html('')
the_nuts

5

Пытаться

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

Или, может быть, посмотрите в функцию removeChild ().

Или если вы используете JQuery Framework.

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


4

Это может быть использовано для очистки параметров:

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

Идите назад. Причина в том, что размер уменьшается после каждого удаления.

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

Надеюсь, этот кодекс поможет вам



2

Самые простые решения самые лучшие, поэтому вам просто нужно:

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

Элементы должны быть удалены в обратном порядке, в противном случае это приведет к ошибке. Кроме того, я не рекомендую просто устанавливать значения null, так как это может вызвать неожиданное поведение.

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

Или, если вы предпочитаете, вы можете сделать это функцией:

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

Над кодом ответа нужно внести небольшие изменения, чтобы полностью завершить список, пожалуйста, проверьте этот фрагмент кода.

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

обновите длину, и он удалит все данные из выпадающего списка. Надеюсь, это кому-нибудь поможет.


Хорошее дополнение - на мгновение был озадачен тем, почему он не удаляет все варианты каждый раз.
Ralpharoo

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

0

Если вам нужно поддерживать IE, и в вашем списке выбора более 100 элементов, я настоятельно рекомендую заменить его на функцию, подобную следующей:

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

Параметр select должен быть элементом либо из селектора jquery, либо из вызова document.getElementBy. Единственным недостатком этого является то, что вы теряете события, которые вы подключили к селекту, но вы можете легко присоединить их, когда они возвращаются из функции. Я работал с выбором, в котором было ~ 3 тыс. Элементов, и на IE9 потребовалось 4 секунды, чтобы очистить выбор, чтобы я мог обновить его с новым содержимым. Почти мгновенно, делая это таким образом.


Вы можете найти больше информации здесь: somacon.com/p542.php и более простой способ:$('#selectbox').replaceWith($('#selectbox')[0].cloneNode(false));
FDisk

0

Для Vanilla JavaScript существует простой и элегантный способ сделать это:

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

-1

Сегодня я столкнулся с той же проблемой, я сделал, как показано ниже, при перезагрузке выбора. (В Простом 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);

        }

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.