Як очистити всі параметри у спадному вікні?


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 () реальне рішення.
Пітер Краусс

Відповіді:


35

Для очищення всіх елементів можна скористатись наведеним нижче.

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
Це здається поганою ідеєю - встановлення елементів на нуль не те саме, що їх видалення.

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
Так, це не вдасться, оскільки метод delete () переставить масив. Якщо це зробити назад, гарантується, що елемент, який буде видалений, буде існувати.
Фабіано

Додавання selectbox.options.length = 0; врешті-решт визначення може зробити його ідеальним у всіх браузерах.
omkar sirra

4
Простий код - це час (selectEl.options.length) selectEl.options.remove (0)
MiF

127

Якщо ви хочете мати легкий сценарій, тоді перейдіть до jQuery. У jQuery рішення для видалення всіх параметрів буде таким:

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

46
Я б стверджував, що сам акт додавання 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 Я не сумніваюся, що сама функція є найвищою якістю та продуктивністю. Але завантаження файлу 86kb (стиснута версія версії 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();

Насправді він працює для мене з будь-яким списком варіантів, як, наприклад, даталіст.

Сподіваюся, це допомагає.


5
Хороша відповідь повинна містити більше деталей, ніж ця. Читач може і не здогадуватися, що ви, мабуть, маєте на увазі jQuery.
Mifeet

5
@Mifeet Якщо користувач не має уявлення про те, що тут означає JQuery, він повинен змінити кар'єру
Emilio Gort

6

Зауважте, що вибір може мати колекцію обох
- optgroup &
- options
.

Так,

Спосіб №1

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

Спосіб №2

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

Я протестував, обидва працюють на Chrome.
Мені подобається простіший, старомодний, метод №1.


1
Це найкраща відповідь. Крім того, якщо у вас вже є посилання jquery на вибір:$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;
}

оновіть довжину, і це видалить усі дані зі спадного списку. Сподіваюся, що це комусь допоможе.


Приємне доповнення - на мить натрапило на те, чому він не видаляє всі варіанти кожного разу.
Ральфару

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 call. Єдиним недоліком цього є те, що ви втрачаєте події, які ви з'єднали до вибору, але ви можете легко приєднати їх назад, оскільки вони повертаються назад із функції. Я працював з виділенням, у якого було ~ 3 к. Елементів, і на IE9 знадобиться 4 секунди, щоб очистити вибір, щоб я міг оновити його новим вмістом. Майже миттєво це роблять таким чином.


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

0

Для ванільного 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.