Come rimuovete tutte le opzioni di una casella di selezione e quindi aggiungete un'opzione e selezionatela con jQuery?


1077

Utilizzando core jQuery, come rimuovere tutte le opzioni di una casella di selezione, quindi aggiungere un'opzione e selezionarla?

La mia casella di selezione è la seguente.

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

EDIT: il seguente codice è stato utile con il concatenamento. Tuttavia, (in Internet Explorer) .val('whatever')non ha selezionato l'opzione che è stata aggiunta. (Ho usato lo stesso 'valore' in entrambi .appende .val.)

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

EDIT: Cercando di farlo imitare questo codice, utilizzo il seguente codice ogni volta che la pagina / modulo viene ripristinato. Questa casella di selezione è popolata da una serie di pulsanti di opzione. .focus()era più vicino, ma l'opzione non sembrava selezionata come fa con .selected= "true". Non c'è niente di sbagliato nel mio codice esistente: sto solo cercando di imparare 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: la risposta selezionata era vicina a ciò di cui avevo bisogno. Questo ha funzionato per me:

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

Ma entrambe le risposte mi hanno portato alla mia soluzione finale ..

Risposte:


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

3
@nickf: ho lo stesso problema, ma devo aggiungere una serie di caselle di controllo anziché una al cambio del menu a discesa, ma le mie caselle di controllo provengono da XML. questo non funziona
defau1t

10
Nota che potresti anche rompere l'opzione / attr / text come:.append($("<option></option>").attr("value", '123').text('ABC!')
Brock Hensley il

1
@BrockHensley, credo che la vera eleganza di questa risposta sia il corretto concatenamento in combo con la funzione end (). Anche il tuo suggerimento funzionerà. Dalla documentazione API di jQuery: "La maggior parte dei metodi di attraversamento DOM di jQuery operano su un'istanza di oggetto jQuery e ne producono una nuova, abbinando un diverso set di elementi DOM. Quando ciò accade, è come se il nuovo set di elementi fosse inserito in uno stack che viene mantenuto all'interno dell'oggetto. Ogni metodo di filtro successivo inserisce un nuovo set di elementi nello stack. Se abbiamo bisogno di un set di elementi più vecchio, possiamo usare end () per rimuovere i set dallo stack. "
Anthony Mason,

1
questo è stato l'unico modo in cui sono stato in grado di ricostruire il mio menu e modificare l'opzione selezionata in jQuery Mobile su PhoneGap per iOS. È stato inoltre necessario aggiornare il menu in seguito.
xitato il

3
@BrockHensley potresti persino arrivare fino a.append($("<option></option>", {'value':'123'}).text('ABC!')
vahanpwns

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

34
Solo per curiosità, "vuoto" è più veloce di "trova"? Sembra che sarebbe - perché il 'find' avrebbe usato un selettore e 'empty' avrebbe semplicemente forzato lo svuotamento dell'elemento.
Dan Esparza,

52
@DanEsparza Ti ho fatto diventare un jsperf; empty()ovviamente più veloce;) jsperf.com/find-remove-vs-empty
vzwick

Ho avuto un bizzarro problema tecnico con questa soluzione. La parte popolata è ok, ma quando provo a selezionare un valore (nel mio caso un giorno), posso consolarlo registrandone il valore, ma il valore mostrato nel campo di selezione rimane nel primo valore .... Posso risolvilo: /
Takács Zsolt

5
@ TakácsZsolt Forse dovresti aggiungere un .val('whatever')alla fine della catena come nella risposta di Matt.
Kodos Johnson,

.empty () funziona con materialize, mentre .remove () non ha funzionato
OverlordvI

127

perché non usare semplicemente javascript?

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

7
Sono d'accordo che questa è la soluzione più semplice per rimuovere tutte le opzioni, ma che risponde solo a metà della domanda ...
Elezar

2
Ciò non creerebbe una perdita di memoria? Gli elementi opzione sono ora inaccessibili ma ancora allocati.
Synetech,

1
Plain Old JS FTW (per la vittoria) !!! :)
raddevus

78

Se il tuo obiettivo è rimuovere tutte le opzioni dalla selezione tranne la prima (in genere l'opzione "Seleziona un elemento") puoi utilizzare:

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

10
Questa dovrebbe essere la risposta. Tutti gli altri hanno rimosso intenzionalmente il primo al fine di ricrearlo in seguito, cosa che non mi piace; implica anche che hanno memorizzato la prima opzione anche da qualche parte prima.

76

Ho avuto un bug in IE7 (funziona bene in IE6) in cui l'utilizzo dei metodi jQuery sopra avrebbe cancellato la selezione nel DOM ma non sullo schermo. Utilizzando la IE Developer Toolbar ho potuto confermare che la selezione era stata cancellata e aveva i nuovi elementi, ma visivamente la selezione mostrava ancora i vecchi elementi, anche se non era possibile selezionarli.

La correzione consisteva nell'utilizzare metodi / proprietà DOM standard (come l'originale del poster) per cancellare anziché jQuery - usando comunque jQuery per aggiungere opzioni.

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

6
Ho dovuto usare questo metodo anche in ie6 perché .empty () ha reso visibile la mia casella di selezione contenuta in un contenitore nascosto anche mentre il genitore era nascosto.
Codice comandante

2
Questo metodo risulta essere anche leggermente più performante (circa l'1%) più performante: jsperf.com/find-remove-vs-empty
vzwick

3
+1 questo è il più leggibile (secondo me) e in jsPerf link (link @vzwick) la risposta accettata è stata più lenta del 34% (Opera 20)
Morvael

35

Non so esattamente cosa intendi per "aggiungine uno e selezionalo", poiché sarà comunque selezionato di default. Ma se dovessi aggiungere più di uno, avrebbe più senso. Che ne dici di qualcosa come:

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

Risposta a "MODIFICA" : puoi chiarire cosa intendi con "Questa casella di selezione è popolata da una serie di pulsanti di opzione"? Un <select>elemento non può (legalmente) contenere <input type="radio">elementi.


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

2
Stiamo ancora utilizzando IE6 e questo metodo non ha funzionato. Tuttavia, ha funzionato in FF 3.5.6
Jay Corbett il

3
potrebbe essere necessario aggiungere .change () alla fine per attivare il cambio di selezione
Hayden Chambers

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

12

Grazie alle risposte che ho ricevuto, sono stato in grado di creare qualcosa di simile al seguente, adatto alle mie esigenze. La mia domanda era alquanto ambigua. Grazie per il follow-up. Il mio ultimo problema è stato risolto includendo "selezionato" nell'opzione che volevo selezionato.

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

Che ne dici di cambiare l'html in nuovi dati.

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

Un altro esempio:

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

8
  1. Per prima cosa deseleziona tutte le opzioni esistenti esegui la prima (- Seleziona--)

  2. Aggiungi nuovi valori di opzione usando il ciclo uno per uno

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

Ho trovato in rete qualcosa di simile al di sotto. Con migliaia di opzioni come nella mia situazione, questo è molto più veloce di .empty()o .find().remove()di 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;
}

Maggiori informazioni qui .



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

La prima riga di codice rimuoverà tutte le opzioni di una casella di selezione poiché non è stata menzionata alcuna opzione di ricerca criteri.

La seconda riga di codice aggiungerà l'Opzione con il valore specificato ("testValue") e Testo ("TestText").


Sebbene ciò possa rispondere alla domanda, sarebbe molto più utile se tu fornissi una spiegazione su come risponde.
Nick,

6

Basandosi sulla risposta di mauretto, questo è un po 'più facile da leggere e comprendere:

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

Per rimuovere tutte le opzioni tranne una con un valore specifico, è possibile utilizzare questo:

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

Ciò sarebbe meglio se l'opzione da aggiungere fosse già presente.


4

Utilizza il prop jquery () per cancellare l'opzione selezionata

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

1
.prop () entra in vigore solo in jQuery 1.6+. Per jQuery 1.5-, utilizzare .attr ()
Agi Hammerthief il

4

Questo sostituirà il tuo mySelect esistente con un nuovo mySelect.

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

4

Puoi farlo semplicemente sostituendo html

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

4

Solo una riga per rimuovere tutte le opzioni dal tag select e dopo aver aggiunto tutte le opzioni, fai una seconda riga per aggiungere opzioni.

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

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

2
  • salva i valori delle opzioni da aggiungere in un oggetto
  • cancella le opzioni esistenti nel tag select
  • iterare l'oggetto elenco e aggiungere i contenuti al tag di selezione previsto

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

Spero che funzioni

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

funziona se più di un'opzione non riesco a selezionare la seconda
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('');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.