Bir seçim kutusunun tüm seçeneklerini nasıl kaldırırsınız ve sonra bir seçenek ekleyip jQuery ile nasıl seçersiniz?


1077

Core jQuery kullanarak, bir seçim kutusunun tüm seçeneklerini nasıl kaldırırsınız, sonra bir seçenek ekleyip seçersiniz?

Seçim kutum aşağıdaki.

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

EDIT: Aşağıdaki kod zincirleme ile yardımcı oldu. Ancak, (Internet Explorer'da) .val('whatever')eklenen seçeneği belirlemedi. (Her ikisi de, aynı 'değeri' kullandı .appendve .val.)

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

EDIT: Bu kodu taklit etmek için çalışırken, sayfa / form sıfırlandığında aşağıdaki kodu kullanın. Bu seçim kutusu bir dizi radyo düğmesi ile doldurulur. .focus()daha yakındı, ancak seçenek olduğu gibi seçili görünmedi .selected= "true". Mevcut kodumda hiçbir şey yanlış değil - sadece jQuery öğrenmeye çalışıyorum.

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

EDIT: seçilen cevap ihtiyacım olana yakındı. Bu benim için çalıştı:

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

Ama her iki cevap da beni son çözümüme götürdü.

Yanıtlar:


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

3
@nickf: Ben de aynı sorun var, ama bir açılan kutunun değişikliği yerine bir dizi onay kutusu eklemeniz gerekir ama benim onay kutuları xml geliyor. Bu işe yaramazsa
defau1t

10
: Ayrıca seçenek / özn / metin gibi parçalamak olabilir Not.append($("<option></option>").attr("value", '123').text('ABC!')
Brock Hensley

1
@BrockHensley, bu cevabın gerçek zarafetinin end () fonksiyonu ile kombo halinde doğru zincirleme olduğuna inanıyorum. Öneriniz de işe yarayacak. JQuery API Dokümanlarından: "jQuery'nin DOM geçiş yöntemlerinin çoğu, bir jQuery nesnesi örneğinde çalışır ve farklı bir DOM öğesi kümesiyle eşleşen yeni bir tane oluşturur. Art arda gelen her filtreleme yöntemi yığının üzerine yeni bir öğe kümesi iter. Daha eski bir öğe kümesine ihtiyacımız olursa, kümeleri yığının dışına çıkarmak için end () öğesini kullanabiliriz. "
Anthony Mason

1
iOS için PhoneGap üzerinde jQuery Mobile'da menümü yeniden oluşturmanın ve seçilen seçeneği değiştirebilmemin tek yolu buydu. Daha sonra menünün yenilenmesi de gerekiyordu.
xited

3
@BrockHensley bile kadar ileri gidebilir.append($("<option></option>", {'value':'123'}).text('ABC!')
vahanpwns

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

34
Sadece meraktan 'boş' bulmaktan daha mı hızlı? Görünüşe göre - 'bul' bir seçici kullanır ve 'boş' öğeyi boşaltmak için kaba kuvvet uygular.
Dan Esparza

52
@DanEsparza Seni jsperf yaptım; empty()elbette daha hızlı çıktı;) jsperf.com/find-remove-vs-empty
vzwick

Bu çözümle garip bir aksaklık yaşadım. Doldurma kısmı iyi, ama bir değer seçmeye çalıştığımda (benim durumumda bir gün), değeri günlüğe kaydedebilirim, ancak seçim alanında gösterilen değer ilk değerde kalır ....
düzeltemiyorum

5
@ TakácsZsolt Belki .val('whatever')zincirin sonuna Matt'in cevabında olduğu gibi a eklemelisiniz .
Kodos Johnson

.empty () gerçekleştirme ile çalışır, oysa .remove () çalışmadı
OverlordvI

127

neden sadece düz javascript kullanmıyorsunuz?

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

7
Bunun tüm seçenekleri kaldırmak için en basit çözüm olduğunu kabul ediyorum, ancak sorunun sadece yarısını cevaplıyor ...
Elezar

2
Bu bir bellek sızıntısı yaratmaz mı? Seçenek öğelerine artık erişilemez, ancak yine de ayrılmıştır.
19'da Synetech

1
Düz Eski JS FTW (Kazanmak İçin) !!! :)
raddevus

78

Hedefiniz ilk seçenek dışındaki seçeneklerden (genellikle 'Lütfen bir öğe seçin' seçeneği) tüm seçenekleri kaldırmaksa:

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

10
Cevap bu olmalı. Diğerleri bilerek sonradan yeniden yaratmak için ilkini kasıtlı olarak kaldırdı, ki bu hoşuma gitmedi; aynı zamanda ilk seçeneği ilk önce bir yerde sakladıklarını da ima eder.

76

Yukarıdaki jQuery yöntemlerini kullanarak DOM seçim ekranda değil, IE7 (IE6 iyi çalışır) bir hata vardı . Araç bunu teyit olabilir IE Geliştirici kullanma seçeneğini temizlenir ve yeni öğeler vardı, ama görsel olarak olmuştu seçeneğini seçersiniz olamazdı rağmen - hala eski öğeleri gösterdi.

Düzeltme, jQuery yerine temizlemek için standart DOM yöntemlerini / özelliklerini (poster orijinalinde olduğu gibi) kullanmaktı - yine de seçenekler eklemek için jQuery kullanıyordu.

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

6
Bu yöntemi ie6'da da kullanmak zorunda kaldım.
Kod Komutanı

2
Bu yöntem aynı zamanda biraz daha fazla performans gösterir (yaklaşık% 1): jsperf.com/find-remove-vs-empty
vzwick

3
+1 bu en okunabilir (bence) ve jsPerf bağlantısında (@vzwick bağlantılı) kabul edilen cevap% 34 daha yavaştı (Opera 20)
Morvael

35

"Bir tane ekleyin ve seçin" ile tam olarak ne demek istediğinizden emin değilsiniz, çünkü zaten varsayılan olarak seçilecektir. Ancak, birden fazla eklemeniz daha mantıklı olurdu. Nasıl bir şey hakkında:

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

"DÜZENLE" yanıt : "Bu seçim kutusu bir dizi radyo düğmesi ile doldurulur" ile netleştirebilir misiniz? Bir <select>öğe (yasal olarak) <input type="radio">öğeler içeremez .


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

2
Hala IE6 kullanıyoruz ve bu yöntem işe yaramadı. Ancak, FF 3.5.6
Jay Corbett

3
seçim değişikliğini tetiklemek için sonuna .change () eklemek gerekebilir
Hayden Chambers

22
$("#control").html("<option selected=\"selected\">The Option...</option>");

12

Aldığım cevaplar sayesinde, ihtiyaçlarıma uygun aşağıdaki gibi bir şey yaratabildim. Sorum biraz belirsizdi. Takip ettiğiniz için teşekkürler. Son sorunum, seçilmesini istediğim seçeneğe "seçildi" eklenerek çözüldü.

$(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'yi yeni verilere dönüştürmeye ne dersiniz?

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

Başka bir örnek:

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

8
  1. Önce mevcut tüm seçeneği temizle ilkini yürüt (- Seç--)

  2. Döngüyü tek tek kullanarak yeni seçenek değerleri ekleyin

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

İnternette aşağıdaki gibi bir şey buldum. Seçenekler binlerce benim durumda ister sayesinde bu çok daha hızlı olduğunu .empty()veya .find().remove()jQuery dan.

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

Daha fazla bilgi burada .



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

İlk kod satırı, seçenek bulma ölçütlerinden bahsedilmediğinden, bir seçim kutusunun tüm seçeneklerini kaldıracaktır.

İkinci kod satırı, belirtilen değere ("testValue") ve Text ("TestText") seçeneğine ekler.


Bu soruya cevap verebilirken, soruyu nasıl cevapladığına dair bir açıklama vermeniz çok daha yararlı olacaktır .
Nick

6

Mauretto'nun cevabına dayanarak, bu okumak ve anlamak biraz daha kolaydır:

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

Belirli bir değere sahip biri hariç tüm seçenekleri kaldırmak için şunu kullanabilirsiniz:

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

Eklenecek seçenek zaten mevcut olsaydı bu daha iyi olurdu.


4

Seçilen seçeneği temizlemek için jquery prop () yöntemini kullanır

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

1
.prop () yalnızca jQuery 1.6+ sürümünde yürürlüğe girer. JQuery 1.5- için .attr ()
Agi Hammerthief

4

Bu, mevcut mySelect'inizi yeni bir mySelect ile değiştirecektir.

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

4

HTML'yi değiştirerek kolayca yapabilirsiniz

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

4

Seçim etiketinden tüm seçenekleri kaldırmak için sadece bir satır ve herhangi bir seçenek ekledikten sonra seçenek eklemek için ikinci satır yapın.

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

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

2
  • nesneye eklenecek seçenek değerlerini kaydetme
  • seçim etiketindeki mevcut seçenekleri temizle
  • liste nesnesini yineleyin ve içeriği istenen seçim etiketine ekleyin

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

Umarım işe yarar

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

daha sonra seçenek i ikincisini seçemezseniz çalışır
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('');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.