jQuery - impostazione del valore selezionato di un controllo select tramite la sua descrizione testuale


530

Ho un controllo di selezione e in una variabile javascript ho una stringa di testo.

Usando jQuery voglio impostare l'elemento selezionato del controllo di selezione in modo che sia l'elemento con la descrizione del testo che ho (al contrario del valore, che non ho).

So che impostarlo in base al valore è piuttosto banale. per esempio

$("#my-select").val(myVal);

Ma sono un po 'sconcertato nel farlo tramite la descrizione del testo. Immagino che ci debba essere un modo per ottenere il valore dalla descrizione del testo, ma il mio cervello è troppo venerdì pomeriggio per essere in grado di risolverlo.


1
@DanAtkinson stava per fare lo stesso da solo. select non ha assolutamente nulla a che fare con questa domanda.
signore

Risposte:


757

Selezionare per descrizione per jQuery v1.6 +

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).prop('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

versioni di jQuery inferiori a 1.6 e successive o uguali a 1.4

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).attr('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

Si noti che sebbene questo approccio funzionerà con versioni precedenti alla 1.6 ma inferiori alla 1.9, è stato deprecato dalla 1.6. Non funzionerà in jQuery 1.9+.


Versione precedente

val() dovrebbe gestire entrambi i casi.

$('select').val('1'); // selects "Two"
$('select').val('Two'); // also selects "Two"
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>


6
Sembra che non dovrebbe funzionare (sembra che potrebbe essere ambiguo) ma in realtà dovrebbe funzionare bene per me. Grazie.
DanSingerman,

69
Si noti che jQuery 1.4 ora ha modificato questo comportamento per selezionare valuese l'attributo è stato specificato e selezionare solo per testo se l' valueattributo è mancante. Quindi in questo esempio $('select').val('Two')selezionerà la seconda opzione in 1.3.x, ma non farà nulla in 1.4.x.
Crescent Fresh

18
Quindi, qual è il modo migliore per farlo ora in 1.4?
JR Lawhorne,

4
Nelle versioni più recenti di jQuery, .val ('not-an-option-value') ripristinerà la selezione alla prima opzione.
dland

5
La prima risposta a questa domanda sembra essere la soluzione post 1.3.x stackoverflow.com/questions/3644449/…
DA.

142

Non l'ho provato, ma potrebbe funzionare per te.

$("select#my-select option")
   .each(function() { this.selected = (this.text == myVal); });

90

Prova questo ... per selezionare l'opzione con il testo myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);

La risposta di @ spoulson ha funzionato per me ... Ho provato a farlo senza il .each
Jay Corbett,

2
In molti casi, questo approccio non funziona sfortunatamente. Di tanto in tanto dovevo anche risolvere lo $("#my-Select option[text=" + myText +"]").get(0).selected = true;stile classico : (...
Shahriyar Imanov,

2
Assicurati di rimuovere prima l'attributo selezionato prima di reimpostare, altrimenti sembrerà non funzionare (funziona per me in 1.9)
esse

3
@MarkW Per 1.9, utilizzare .propinvece di .attr; la causa della modifica è che in 1.9 jQuery hanno disabilitato i vecchi hack che ti consentono .attrdi modificare alcune proprietà DOM e gli attributi HTML. (Google javascript dom properties vs attributesse non conosci la distinzione.)
Segna Amery il

Risposta aggiornata da utilizzare .prop('selected', true)anziché .attr('selected', 'selected')per la compatibilità di jQuery 1.9+.
Erwaman,

43

Lo faccio in questo modo (jQuery 1.9.1)

$("#my-select").val("Dutch").change();

Nota: non dimenticare la modifica (), ho dovuto cercare a lungo a causa di quello :)


2
Vorrei poter votare più volte. È passata un'ora e ora posso tornare a casa.
Bob Jordan,

Bella risposta! breve e semplice ... Questo dovrebbe essere in cima ... Continua a votare.
Muhammad Tarique,

Nel mio caso ha funzionato, grazie! Ma questo non viene selezionato non dal testo visualizzato, come richiesto dall'OP, ma dal valore stesso, che l'OP non ha?
Brandon Rhodes,

21
$("#myselect option:contains('YourTextHere')").val();

restituirà il valore della prima opzione contenente la descrizione del testo. Testato questo e funziona.


Grazie - Penso che questa potrebbe essere la versione che uso, dato che devo anche avere una logica per quando non c'è testo corrispondente, e questo sembra il meccanismo più semplice, per poterlo fare.
DanSingerman,

1
tenere presente che otterrà solo il valore per la prima opzione corrispondente al testo.
Russ Cam

Inoltre, potresti attirare la catena attr ("selezionato", "selezionato") sul set avvolto anziché val () e questo funzionerebbe in modo simile alla risposta di CarolinaJay65
Russ Cam

1
OP ha detto " valore di impostazione " non " ottenere valore"
RousseauAlexandre

15

Per evitare tutte le complicazioni della versione jQuery, raccomando sinceramente di utilizzare una di queste funzioni javascript davvero semplici ...

function setSelectByValue(eID,val)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].value==val) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

function setSelectByText(eID,text)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].text==text) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

Consente la selezione di un'opzione di selezione tramite valore o testo (a seconda della funzione chiamata). Ad esempio: setSelectByValue ('sausages', '2'); Troverà e selezionerà l'opzione con valore "2" nell'oggetto di selezione con un ID di "salsicce".
Dave,

2
@Neal Uh ... risponde alla domanda?
Mark Amery,

10

So che questo è un vecchio post, ma non sono riuscito a selezionarlo tramite testo usando jQuery 1.10.3 e le soluzioni sopra. Ho finito per usare il seguente codice (variazione della soluzione di spoulson):

      var textToSelect = "Hello World";

      $("#myDropDown option").each(function (a, b) {
            if ($(this).html() == textToSelect ) $(this).attr("selected", "selected");
        });

Spero che aiuti qualcuno.


10

Questa linea ha funzionato:

$("#myDropDown option:contains(myText)").attr('selected', true);

7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

L'istruzione if fa una corrispondenza esatta con "due" e "due tre" non saranno abbinati


No, non intendevo questo. Penso che il mio commento sia stato un po 'poco chiaro, quindi l'ho appena eliminato. Ho votato a favore della tua risposta, perché ha funzionato per la mia situazione.
Jagd,

6

Il modo più semplice con 1.7+ è:

$("#myDropDown option:text=" + myText +"").attr("selected", "selected"); 

1.9+

$("#myDropDown option:text=" + myText +"").prop("selected", "selected"); 

Testato e funziona.


1
Non in 1.9+ non lo fa. Da 1.6 dovresti usare .propper modificare le proprietà DOM, non .attr(che è per gli attributi HTML / DOM). Vedi stackoverflow.com/q/5874652/1709587
Mark Amery il

Vorrei usare ("selezionato", vero) invece del valore di "selezionato"
mplungjan,


4

dai un'occhiata al plugin jquery Selectedbox

selectOptions(value[, clear]): 

Seleziona le opzioni in base al valore, utilizzando una stringa come parametro $("#myselect2").selectOptions("Value 1");o un'espressione regolare $("#myselect2").selectOptions(/^val/i);.

Puoi anche cancellare le opzioni già selezionate: $("#myselect2").selectOptions("Value 2", true);


3

Solo una nota a margine. Il mio valore selezionato non veniva impostato. E ho cercato in tutta la rete. In realtà ho dovuto selezionare un valore dopo una richiamata da un servizio Web, perché stavo ottenendo dati da esso.

$("#SelectMonth option[value=" + DataFromWebService + "]").attr('selected', 'selected'); 
$("#SelectMonth").selectmenu('refresh', true);

Quindi l'aggiornamento del selettore era l'unica cosa che mi mancava.


Questo è quello giusto - nonostante ... non vedo alcun motivo per la seconda riga. Dovrebbe funzionare così com'è.
Sagive SEO

2

Ho scoperto che usando attrte finiresti con più opzioni selezionate quando non volevi - la soluzione è usare prop:

$("#myDropDown option:text=" + myText +"").prop("selected", "selected");


1

Ho avuto un problema con gli esempi precedenti e il problema è stato causato dal fatto che i valori della mia casella di selezione sono precompilati con stringhe di lunghezza fissa di 6 caratteri, ma il parametro che veniva passato non era di lunghezza fissa.

Ho una funzione rpad che correggerà a destra una stringa, alla lunghezza specificata e con il carattere specificato. Quindi, dopo il riempimento del parametro, funziona.

$('#wsWorkCenter').val(rpad(wsWorkCenter, 6, ' '));


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 

1
 $('#theYear').on('change', function () {
 FY = $(this).find('option:selected').text();
 $('#theFolders').each(function () {
     $('option:not(:contains(' + FY + '))', this).hide();
 });
 $('#theFolders').val(0);
});

$('#theYear').on('mousedown', function () {
 $('#theFolders option').show().find('option:contains("Select")', this).attr('selected', 'selected');
});

0

Questa risposta accettata non sembra corretta, mentre .val ('newValue') è corretto per la funzione, cercando di recuperare una selezione con il suo nome non funziona per me, ho dovuto usare l'id e il nome della classe per ottenere il mio elemento


0

Ecco un'opzione facile. Basta impostare l'opzione dell'elenco quindi impostarne il testo come valore selezionato:

$("#ddlScheduleFrequency option").selected(text("Select One..."));

-1

Prendi i figli della casella di selezione; attraversali; quando hai trovato quello che desideri, impostalo come opzione selezionata; restituisce false per interrompere il looping.

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.