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

153

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

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

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

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

Kirt
источник
Чтобы уничтожить все параметры (!?), А также сбросить в браузере историю выбранных параметров после обновления страницы, использовать 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();
Kangkan
источник
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
32

Это короткий путь:

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

Одна строка, нет для, нет JQuery, просто.

Firemen26
источник
Не самый короткий, смотрите мой ответ ниже.
пользователь
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())

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

с прототипом JS :

$('yourSelect').select('option').invoke('remove');
EpokK
источник
6

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

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

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

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

norgematos
источник
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

Использование JQuery - более красивый, короткий и умный способ сделать это!

$('#selection_box_id').empty();
Собин Солнечный
источник
1
Это действительно просто повторение этого существующего ответа .
Пан
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>

VICHU
источник
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

Я думаю, что это лучшее решение. является

 $ ( "# Myselectid") HTML ( ''); 

Оссама Закария
источник
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>

nitka.pawel
источник
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);
}
Kyllo
источник
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]);
}
user1910893
источник
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);

        }
CHowdappaM
источник
-2
var select =$('#selectbox').val();
user3767285
источник
1
Вы должны быть более информативными в своем ответе
Крупа Патель