Jak usunąć wszystkie opcje pola wyboru, a następnie dodać jedną opcję i wybrać ją za pomocą jQuery?

1077

Używając podstawowego jQuery, w jaki sposób usuwasz wszystkie opcje pola wyboru, a następnie dodajesz jedną opcję i ją wybierasz?

Moje pole wyboru jest następujące.

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

EDYCJA: Poniższy kod był pomocny w tworzeniu łańcuchów. Jednak (w Internet Explorerze) .val('whatever')nie wybrał dodanej opcji. (Zrobiłem używać tego samego „wartość” w obu .appenda .val).

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

EDYCJA: Próbując zmusić go do naśladowania tego kodu, używam następującego kodu za każdym razem, gdy strona / formularz jest resetowany. W tym polu wyboru znajduje się zestaw przycisków opcji. .focus()było bliżej, ale opcja nie wyglądała na wybraną tak jak w przypadku .selected= "true". W moim istniejącym kodzie nie ma nic złego - staram się tylko nauczyć jQuery.

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

EDYCJA: wybrana odpowiedź była zbliżona do tego, czego potrzebowałem. To działało dla mnie:

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

Ale obie odpowiedzi doprowadziły mnie do mojego ostatecznego rozwiązania ...

Jay Corbett
źródło

Odpowiedzi:

1694
$('#mySelect')
    .find('option')
    .remove()
    .end()
    .append('<option value="whatever">text</option>')
    .val('whatever')
;
Matt
źródło
3
@nickf: Mam ten sam problem, ale muszę dodać zestaw pól wyboru zamiast jednego przy zmianie listy rozwijanej, ale moje pola wyboru pochodzą z xml. to nie działa
defau1t
10
Uwaga: możesz także rozbić opcję / attr / text jak:.append($("<option></option>").attr("value", '123').text('ABC!')
Brock Hensley
1
@BrockHensley, uważam, że prawdziwą elegancją tej odpowiedzi jest właściwe łączenie w kombinacji z funkcją end (). Twoja sugestia również zadziała. Z dokumentacji interfejsu API jQuery: „Większość metod przejścia DOM przez jQuery działa na instancji obiektu jQuery i tworzy nową, dopasowując inny zestaw elementów DOM. Gdy to się dzieje, wygląda to tak, jakby nowy zestaw elementów był wypychany na stos który jest utrzymywany wewnątrz obiektu. Każda kolejna metoda filtrowania wypycha nowy zestaw elementów na stos. Jeśli potrzebujemy starszego zestawu elementów, możemy użyć end (), aby usunąć zestawy ze stosu. "
Anthony Mason
1
był to jedyny sposób, w jaki mogłem odbudować moje menu i zmienić wybraną opcję w jQuery Mobile na PhoneGap na iOS. Wymagane było także odświeżenie menu później.
xited
3
@BrockHensley możesz nawet posunąć się tak daleko.append($("<option></option>", {'value':'123'}).text('ABC!')
vahanpwns,
709
$('#mySelect')
    .empty()
    .append('<option selected="selected" value="whatever">text</option>')
;
Mahzilla
źródło
34
Z ciekawości, czy „pusty” jest szybszy niż „znaleźć”? Wygląda na to, że tak byłoby, ponieważ „znajdź” użyłoby selektora, a „pusty” po prostu brutalną siłą opuściłby element.
Dan Esparza
52
@DanEsparza Zrobiłem ci jsperf; empty()okazało się oczywiście szybsze;) jsperf.com/find-remove-vs-empty
vzwick
Mam dziwną usterkę z tym rozwiązaniem. Wypełnienie tej części jest w porządku, ale kiedy próbuję wybrać wartość (w moim przypadku dzień), mogę konsolować rejestrować wartość, ale wyświetlana wartość w polu wyboru pozostaje na pierwszej wartości ... Mogę tego nie rozwiązuj: /
Takács Zsolt
5
@ TakácsZsolt Może powinieneś dodać .val('whatever')na końcu łańcucha, jak w odpowiedzi Matta.
Kodos Johnson
.empty () działa z materializacją, podczas gdy .remove () nie działał
OverlordvI
127

dlaczego nie użyć zwykłego javascript?

document.getElementById("selectID").options.length = 0;
Shawn
źródło
7
Zgadzam się, że jest to najprostsze rozwiązanie do usunięcia wszystkich opcji, ale to odpowiada tylko na połowę pytania ...
Elezar
2
Czy nie spowodowałoby to wycieku pamięci? Elementy opcji są teraz niedostępne, ale nadal są przydzielane.
Synetech
1
Plain Old JS FTW (For the Win) !!! :)
raddevus
78

Jeśli Twoim celem jest usunięcie wszystkich opcji z zaznaczenia oprócz pierwszej (zazwyczaj opcji „Proszę wybrać element”), której możesz użyć:

$('#mySelect').find('option:not(:first)').remove();
mauretto
źródło
10
To powinna być odpowiedź. Wszyscy inni celowo usunęli pierwszy z myślą o odtworzeniu go później, co mi się nie podoba; oznacza to również, że pierwszą opcję zapisali gdzieś jako pierwszą.
76

Miałem błąd w IE7 (działa dobrze w IE6), gdzie użycie powyższych metod jQuery wyczyści zaznaczenie w DOM, ale nie na ekranie. Korzystanie z IE Developer Toolbar mogę potwierdzić, że wybierzesz zostały wyczyszczone i miał nowe elementy, ale wizualnie select wciąż pokazywało stare elementy - nawet jeśli nie można było ich wybrać.

Rozwiązaniem było użycie standardowych metod / właściwości DOM (tak jak miało to miejsce w oryginalnym plakacie) zamiast czyszczenia jQuery - nadal używając jQuery do dodawania opcji.

$('#mySelect')[0].options.length = 0;
wiersz 1
źródło
6
Musiałem użyć tej metody również w ie6, ponieważ .empty () spowodował, że moje pole wyboru, które było zawarte w ukrytym kontenerze, stało się widoczne, nawet gdy rodzic był ukryty.
Code Commander
2
Ta metoda okazuje się również nieco (około 1%) bardziej wydajna: jsperf.com/find-remove-vs-empty
vzwick
3
+1 to jest najbardziej czytelny (moim zdaniem), aw linku jsPerf (link @vzwick) zaakceptowana odpowiedź była o 34% wolniejsza (Opera 20)
Morvael
35

Nie jestem pewien, co dokładnie rozumiesz przez „dodaj i wybierz”, ponieważ i tak zostanie on domyślnie wybrany. Ale gdyby dodać więcej niż jeden, miałoby to większy sens. Co powiesz na coś takiego:

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

Odpowiedź na „EDYCJA” : Czy możesz wyjaśnić, co rozumiesz przez „To pole wyboru jest wypełnione zestawem przycisków opcji”? <select>Element może nie (prawnie) zawierają <input type="radio">elementy.

Bobby Jack
źródło
27
$('#mySelect')
    .empty()
    .append('<option value="whatever">text</option>')
    .find('option:first')
    .attr("selected","selected")
;
Hayden Chambers
źródło
2
Nadal używamy IE6 i ta metoda nie działała. Jednak zadziałało w FF 3.5.6
Jay Corbett
3
być może trzeba dodać .change () na końcu, aby wywołać zmianę select
Hayden Chambers
22
$("#control").html("<option selected=\"selected\">The Option...</option>");
Jvaranda
źródło
12

Dzięki otrzymanym odpowiedziom udało mi się stworzyć coś takiego, co odpowiada moim potrzebom. Moje pytanie było nieco dwuznaczne. Dzięki za kontynuację. Mój ostatni problem został rozwiązany poprzez włączenie „wybranego” do opcji, którą chciałem wybrać.

$(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>

Jay Corbett
źródło
8

Co powiesz na zmianę html na nowe dane?

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

Inny przykład:

$('#mySelect').html('
    <option value="1" selected>text1</option>
    <option value="2">text2</option>
    <option value="3" disabled>text3</option>
');
Shiv
źródło
8
  1. Najpierw wyczyść wszystkie istniejące opcje wykonaj pierwszą (- Wybierz--)

  2. Dołącz nowe wartości opcji za pomocą pętli jedna po drugiej

    $('#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));
    }
Jaydeep Shil
źródło
7

Znalazłem w sieci coś jak poniżej. Z tysiącami opcji takich jak w mojej sytuacji jest to o wiele szybsze niż .empty()lub .find().remove()z 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;
}

Więcej informacji tutaj .

marioosh
źródło
7

Inny sposób:

$('#select').empty().append($('<option>').text('---------').attr('value',''));

Pod tym linkiem znajdują się dobre praktyki https://api.jquery.com/select/

Jhon Intriago Thoth
źródło
7
$("#id option").remove();
$("#id").append('<option value="testValue" >TestText</option>');

Pierwszy wiersz kodu usunie wszystkie opcje pola wyboru, ponieważ nie wymieniono kryteriów wyszukiwania opcji.

Drugi wiersz kodu doda opcję z określoną wartością („testValue”) i tekstem („TestText”).

Dev Chauhan
źródło
Chociaż może to odpowiedzieć na pytanie, o wiele bardziej przydatne byłoby podanie wyjaśnienia, w jaki sposób na nie odpowiada.
Nick
6

Opierając się na odpowiedzi mauretto, jest to trochę łatwiejsze do odczytania i zrozumienia:

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

Aby usunąć wszystkie opcje oprócz jednej z określoną wartością, możesz użyć tego:

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

Byłoby lepiej, gdyby opcja dodawania była już dostępna.

humbads
źródło
4

Używa jquery prop (), aby wyczyścić wybraną opcję

$('#mySelect option:selected').prop('selected', false);
mehrdad
źródło
1
.prop () działa tylko w jQuery 1.6+. W przypadku jQuery 1.5- użyj .attr ()
Agi Hammerthief
4

Spowoduje to zastąpienie istniejącego mySelect nowym mySelect.

$('#mySelect').replaceWith('<Select id="mySelect" size="9">
   <option value="whatever" selected="selected" >text</option>
   </Select>');
Barun
źródło
4

Możesz to zrobić po prostu zastępując HTML

$('#mySelect')
.html('<option value="whatever" selected>text</option>')
.trigger('change');
Nadeem Manzoor
źródło
4

Tylko jeden wiersz, aby usunąć wszystkie opcje ze znacznika select, a po dodaniu dowolnych opcji utwórz drugi wiersz, aby dodać opcje.

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

$('.ddlsl').append(new Option('Select all', 'all'));
Kaushik shrimali
źródło
2
  • zapisz wartości opcji, które zostaną dołączone do obiektu
  • wyczyść istniejące opcje w znaczniku wyboru
  • iteruj obiekt listy i dołącz zawartość do zamierzonego znacznika wyboru

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>

Nifemi Sola-Ojo
źródło
2

Widziałem ten kod w Select2 - Usuwanie zaznaczeń

$('#mySelect').val(null).trigger('change');

Ten kod działa dobrze z jQuery nawet bez Select2

michael01angelo
źródło
1

Mam nadzieję, że to zadziała

$('#myselect').find('option').remove()
.append($('<option></option>').val('value1').html('option1'));
Md. Russel Hussain
źródło
działa, jeśli więcej niż opcja nie mogę wybrać drugiej
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('');
LN Nitharsan
źródło