Як ви видалите всі параметри поля вибору, а потім додайте один варіант і виберіть його за допомогою jQuery?


1077

Використовуючи основний jQuery, як ви видалите всі параметри вибору, а потім додаєте одну опцію та виберіть її?

Мій вікно вибору таке.

<Select id="mySelect" size="9"> </Select>

EDIT: Наступний код був корисним для ланцюжка. Однак (в Internet Explorer) .val('whatever')не вибрали додану опцію. (Я використовував те саме "значення" в обох .appendі .val.)

$('#mySelect').find('option').remove().end()
.append('<option value="whatever">text</option>').val('whatever');

EDIT: Намагаючись змусити наслідувати цей код, я використовую такий код щоразу, коли сторінку / форму скидають. Це поле для вибору заповнюється набором перемикачів. .focus()було ближче, але параметр не виглядав вибраним, як це робиться з .selected= "true". З моїм наявним кодом нічого поганого - я просто намагаюся вивчити jQuery.

var mySelect = document.getElementById('mySelect');
mySelect.options.length = 0;
mySelect.options[0] = new Option ("Foo (only choice)", "Foo");
mySelect.options[0].selected="true";

EDIT: обрана відповідь була близькою до того, що мені потрібно. Це працювало для мене:

$('#mySelect').children().remove().end()
.append('<option selected value="whatever">text</option>') ;

Але обидві відповіді привели мене до остаточного рішення ..

Відповіді:


1694
$('#mySelect')
    .find('option')
    .remove()
    .end()
    .append('<option value="whatever">text</option>')
    .val('whatever')
;

3
@nickf: У мене така ж проблема, але мені потрібно додати набір прапорців, а не один, при зміні спаду, але мої прапорці надходять із xml. це не працює
defau1t

10
Зауважте, що ви також можете розбити варіант / attr / текст на кшталт:.append($("<option></option>").attr("value", '123').text('ABC!')
Brock Hensley

1
@BrockHensley, я вважаю, що справжня елегантність цієї відповіді - це належне поєднання в поєднанні з функцією end (). Ваша пропозиція також буде працювати. З документації API jQuery: "Більшість методів обходу DOM jQuery працюють на екземплярі об'єкта jQuery і створюють новий, що відповідає різному набору елементів DOM. Коли це трапляється, це так, ніби новий набір елементів висувається на стек що підтримується всередині об'єкта. Кожен наступний метод фільтрації виштовхує новий набір елементів на стек. Якщо нам потрібен старіший набір елементів, ми можемо використовувати end (), щоб повернути набори назад зі стека. "
Ентоні Мейсон

1
це був єдиний спосіб, коли я зміг відновити своє меню та змінити вибраний варіант у jQuery Mobile на PhoneGap для iOS. Після цього також потрібно було оновити меню.
xited

3
@BrockHensley можна навіть зайти так далеко, як.append($("<option></option>", {'value':'123'}).text('ABC!')
vahanpwns

709
$('#mySelect')
    .empty()
    .append('<option selected="selected" value="whatever">text</option>')
;

34
Тільки з цікавості, чи «порожній» швидше, ніж «знайти»? Здається, це було б так, тому що "знайти" використовує селектор, а "порожній" просто напулить елемент.
Дан Еспарза

52
@DanEsparza Я зробив тебе jsperf; empty()вийшло швидше звичайно;) jsperf.com/find-remove-vs-empty
vzwick

З цим рішенням у мене з’явилися грізні проблеми. Частина заповнення це нормально, але коли я намагаюся вибрати значення (у моєму випадку - день), я можу консолірувати вхід значення, але показане значення у полі виділення залишається першим значенням. Я можу Не вирішую це: /
Takács Zsolt

5
@ TakácsZsolt Можливо, вам слід додати а .val('whatever')в кінці ланцюжка, як у відповіді Метта.
Кодос Джонсон

.empty () працює з матеріалізацією, тоді як .remove () не працював
OverlordvI

127

чому б не просто використовувати звичайний javascript?

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

7
Я погоджуюся, що це найпростіше рішення для видалення всіх варіантів, але це відповідає лише на половину питання ...
Елезар

2
Чи не створило б це пам'ять протікання? Елементи опції зараз недоступні, але все ще виділяються.
Synetech

1
Простий старий JS FTW (For The Win) !!! :)
raddevus

78

Якщо ваша мета - вилучити всі параметри з вибору, окрім першого (як правило, опція "Виберіть товар"), яку ви можете використати:

$('#mySelect').find('option:not(:first)').remove();

10
Це має бути відповіддю. Усі інші навмисно зняли перший з метою відтворити його згодом, що мені не подобається; це також означає, що вони також зберігали перший варіант десь спочатку.

76

У мене виникла помилка в IE7 (прекрасно працює в IE6), де за допомогою вищевказаних методів jQuery очистить вибір у DOM, але не на екрані. Використовуючи панель інструментів для розробників IE, я міг підтвердити, що вибір був очищений та у ньому були нові елементи, але візуально виділення все ще показало старі елементи - хоча ви не змогли їх вибрати.

Виправлення полягало у використанні стандартних методів / власних DOM (як це було в оригіналі плаката), а не jQuery - все ще використовуючи jQuery для додавання параметрів.

$('#mySelect')[0].options.length = 0;

6
Мені довелося використовувати цей метод також у ie6, тому що .empty () спричинив видимість мого вікна вибору, який містився у прихованому контейнері, навіть коли батьків було приховано.
Командир коду

2
Цей метод також виявляється крихітним (близько 1%) більш ефективним: jsperf.com/find-remove-vs-empty
vzwick

3
+1 це найчитабельніший (на мою думку) та посилання на jsPerf (@vzwick пов'язаний), прийнята відповідь була на 34% повільніше (Opera 20)
Morvael

35

Не впевнений, що саме ви маєте на увазі під "додавання і виберіть його", оскільки воно буде вибране за замовчуванням. Але, якби ви додали більше одного, це мало б більше сенсу. Як щодо чогось такого:

$('select').children().remove();
$('select').append('<option id="foo">foo</option>');
$('#foo').focus();

Відповідь на "редагування" : Чи можете ви уточнити, що ви маєте на увазі під цим "полем вибору, заповненим набором перемикачів"? <select>Елемент не може ( по закону) містять <input type="radio">елементи.


27
$('#mySelect')
    .empty()
    .append('<option value="whatever">text</option>')
    .find('option:first')
    .attr("selected","selected")
;

2
Ми все ще використовуємо IE6, і цей метод не працював. Однак це зробило роботу у FF 3.5.6
Джей Корбетт

3
можливо, доведеться додати .change () в кінці, щоб викликати зміну вибору
Hayden Chambers


12

Завдяки отриманим відповідям я зміг створити щось на кшталт наступного, що відповідає моїм потребам. Моє запитання було дещо неоднозначним. Дякуємо за продовження роботи. Мою остаточну проблему було вирішено, включивши "вибраний" у варіант, який я хотів обрати.

$(function() {
  $('#mySelect').children().remove().end().append('<option selected value="One">One option</option>') ; // clear the select box, then add one option which is selected
  $("input[name='myRadio']").filter( "[value='1']" ).attr( "checked", "checked" ); // select radio button with value 1
  // Bind click event to each radio button.
  $("input[name='myRadio']").bind("click",
                                  function() {
    switch(this.value) {
      case "1":
        $('#mySelect').find('option').remove().end().append('<option selected value="One">One option</option>') ;
        break ;
      case "2":
        $('#mySelect').find('option').remove() ;
        var items = ["Item1", "Item2", "Item3"] ; // Set locally for demo
        var options = '' ;
        for (var i = 0; i < items.length; i++) {
          if (i==0) {
            options += '<option selected value="' + items[i] + '">' + items[i] + '</option>';
          }
          else {
            options += '<option value="' + items[i] + '">' + items[i] + '</option>';
          }
        }
        $('#mySelect').html(options);   // Populate select box with array
        break ;
    } // Switch end
  } // Bind function end
                                 ); // bind end
}); // Event listener end
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>One<input  name="myRadio" type="radio" value="1"  /></label>
<label>Two<input name="myRadio"  type="radio" value="2" /></label>
<select id="mySelect" size="9"></select>


8

Як щодо просто зміни html на нові дані.

$('#mySelect').html('<option value="whatever">text</option>');

Ще один приклад:

$('#mySelect').html('
    <option value="1" selected>text1</option>
    <option value="2">text2</option>
    <option value="3" disabled>text3</option>
');

8
  1. Спочатку очистіть усі існуючі опції, вилучіть перший (- Виберіть--)

  2. Додайте нові значення параметрів, використовуючи цикл по черзі

    $('#ddlCustomer').find('option:not(:first)').remove();
    for (var i = 0; i < oResult.length; i++) {
       $("#ddlCustomer").append(new Option(oResult[i].CustomerName, oResult[i].CustomerID + '/' + oResult[i].ID));
    }

7

Я знайшов у мережі щось на зразок нижче. З тисячами варіантів, як у моїй ситуації, це набагато швидше, ніж .empty()або .find().remove()від jQuery.

var ClearOptionsFast = function(id) {
    var selectObj = document.getElementById(id);
    var selectParentNode = selectObj.parentNode;
    var newSelectObj = selectObj.cloneNode(false); // Make a shallow copy
    selectParentNode.replaceChild(newSelectObj, selectObj);
    return newSelectObj;
}

Більше інформації тут .



7
$("#id option").remove();
$("#id").append('<option value="testValue" >TestText</option>');

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

Другий рядок коду додасть параметр із заданим значенням ("testValue") та текстом ("TestText").


Хоча це може відповісти на питання, було б набагато корисніше, якби ви дали пояснення, як воно на нього відповідає.
Нік

6

Спираючись на відповідь Моурето, це трохи легше читати та розуміти:

$('#mySelect').find('option').not(':first').remove();

Щоб видалити всі параметри, крім одного із певним значенням, ви можете скористатися цим:

$('#mySelect').find('option').not('[value=123]').remove();

Це було б краще, якби опція для додавання вже була.


4

Використовує jquery prop (), щоб очистити вибраний варіант

$('#mySelect option:selected').prop('selected', false);

1
.prop () набуває чинності лише у jQuery 1.6+. Для jQuery 1.5-, використовуйте .attr ()
Agi Hammerthief

4

Це замінить існуючий mySelect новим mySelect.

$('#mySelect').replaceWith('<Select id="mySelect" size="9">
   <option value="whatever" selected="selected" >text</option>
   </Select>');

4

Це можна зробити просто замінивши html

$('#mySelect')
.html('<option value="whatever" selected>text</option>')
.trigger('change');

4

Лише один рядок, щоб видалити всі параметри з тегу вибору, і після того, як ви зможете додати будь-які варіанти, потім зробіть другий рядок, щоб додати параметри.

$('.ddlsl').empty();

$('.ddlsl').append(new Option('Select all', 'all'));

2
  • збережіть параметри параметрів, які слід додати до об'єкта
  • очистити існуючі параметри в тезі вибору
  • повторіть об'єкт списку та додайте вміст до призначеного тегу вибору

var listToAppend = {'':'Select Vehicle','mc': 'Motor Cyle', 'tr': 'Tricycle'};

$('#selectID').empty();

$.each(listToAppend, function(val, text) {
    $('#selectID').append( new Option(text,val) );
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>



1

Сподіваюся, це спрацює

$('#myselect').find('option').remove()
.append($('<option></option>').val('value1').html('option1'));

він працює, якщо більше, ніж параметр, я не можу вибрати другий
Anburaj_N

0
var select = $('#mySelect');
select.find('option').remove().end()
.append($('<option/>').val('').text('Select'));
var data = [{"id":1,"title":"Option one"}, {"id":2,"title":"Option two"}];
for(var i in data) {
    var d = data[i];
    var option = $('<option/>').val(d.id).text(d.title);
    select.append(option);
}
select.val('');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.