Quale selettore è necessario per selezionare un'opzione in base al suo testo?


207

Devo verificare se a <select>ha un'opzione il cui testo è uguale a un valore specifico.

Ad esempio, se c'è un <option value="123">abc</option>, sarei alla ricerca di "abc".

C'è un selettore per farlo?

Sto cercando qualcosa di simile $('#select option[value="123"]');ma per il testo.


Hmm ... la hasrisposta in SLaks è utile, ma anche il punto nella risposta di Floyds è buono ... Non so cosa accettare.
Hailwood,

inoltre, sono sensibili al maiuscolo / minuscolo? (Sto cercando insensibilità al maiuscolo / minuscolo e posso sempre solo convertire in inferiore
Hailwood,

1
Uso la funzione di base JavaScript .toLowerCase () e confronto, se è richiesta la distinzione tra maiuscole e minuscole. Inoltre, accetta come risposta quello più utile per la tua domanda. :)
Hari Pachuveetil,

non funziona per un menu a discesa con API multi-selezione ?? Ho provato tutte le possibili soluzioni senza fortuna. Sto usando l'API dropdowm multi-selezione di eric hynd. Qualcuno può risolvere questo problema?
Chaitanya Chandurkar,

Risposte:


320

Questo potrebbe aiutare:

$('#test').find('option[text="B"]').val();

Demo violino

Questo ti darebbe l'opzione con il testo Be non quelli che contengono testo che contiene B. Spero che questo ti aiuti

Per le versioni recenti di jQuery quanto sopra non funziona. Come commentato da Quandary di seguito, questo è ciò che funziona per jQuery 1.9.1:

$('#test option').filter(function () { return $(this).html() == "B"; }).val();

Violino aggiornato


1
questo non funziona con le ultime versioni di jquery (se si rimuove 'value =' da <opzione>)
KevinDeus,

27
@KevinDeus: perché il downvote !? La risposta era per la versione di jQuery allora!
Hari Pachuveetil,

11
Invece, usa $ ('# opzione test'). Filter (function () {return $ (this) .html () == "B";}). Val ();
Stefan Steiger

84
@Quandary Tuttavia, non è un motivo valido per votare la risposta verso il basso quando sarebbe sufficiente un breve commento. O ti aspetti che ripeti tutte le sue risposte per ogni nuova versione di jQuery?
WynandB,

2
Penso che il downvote sia dovuto al fatto che l'esempio sopra trova solo il valore selezionato e non imposta il valore selezionato.
nivs1978

133

È possibile utilizzare il :contains()selettore per selezionare elementi che contengono testo specifico.
Per esempio:

$('#mySelect option:contains(abc)')

Per verificare se un determinato <select>elemento ha tale opzione, utilizzare il .has()metodo :

if (mySelect.has('option:contains(abc)').length)

Per trovare tutti gli <select>s che contengono tale opzione, usa il :has()selettore :

$('select:has(option:contains(abc))')

3
:containsnon è definitivo adesso, vero?
Hari Pachuveetil,

Qual è esattamente il problema con contiene?
Ogier Schelvis,

come faresti con solo le opzioni selezionate?
toddmo

Questo non afferra anche un'opzione con 123abcdef?
Teepeemm,

@Teepeemm Sì, questa è la differenza tra le due risposte principali. Il primo controllo solo restituisce l'opzione con solo il testo specifico, questo restituisce l'opzione che contiene, ma non è solo, quel testo specifico. Che, per coincidenza, è ciò di cui ho effettivamente bisogno in questo momento, quindi sono molto contento di averlo pubblicato.
Lee A.

30

Nessuno dei precedenti suggerimenti ha funzionato per me in jQuery 1.7.2 perché sto cercando di impostare l'indice selezionato dell'elenco in base al valore di una casella di testo e alcuni valori di testo sono contenuti in più opzioni. Ho finito per usare il seguente:

$('#mySelect option:contains(' + value + ')').each(function(){
    if ($(this).text() == value) {
        $(this).attr('selected', 'selected');
        return false;
    }
    return true;
});

1
Penso che questa sia la risposta migliore perché in realtà restituisce i risultati corretti. Ma non posso fare a meno di pensare che omettere del containstutto possa effettivamente accelerare le cose.
Styfle

Questo ha funzionato per me, ma nel mio scenario ho potuto fare clic su modifica su una griglia più volte, quindi ho dovuto rimuovere l'attributo selezionato quando non c'era corrispondenza, altrimenti la prima opzione selezionata sarebbe rimasta per le successive modifiche. else {$ (this) .attr ('selected', ''); restituire false; }
esp

Questa soluzione ha funzionato per me, ma invece di impostare l'attributo dell'opzione, per cambiare effettivamente il menu di selezione che dovevo fare: $(this).parent().val($(this).val()); probabilmente potevi fare entrambe le cose, ma per me l'impostazione solo il genitore ha val()fatto il trucco.
Billynoah,


15

Questo ha funzionato per me: $("#test").find("option:contains('abc')");


3
Dovresti aggiungere una spiegazione del perché funziona anche.
Hannes Johansson,

@HannesJohansson O almeno dovrebbe spiegare in che modo è diverso o aggiunge qualcosa di nuovo alla risposta di SLaks che ha quasi cinque anni in più. ; ^)
ruffin,

4
Assicurati di capire che anche questa opzione troverà: <option> abcd </option>.
Charles,

Grazie, questo è assolutamente corretto e ciò che tutti hanno perso è l'aggiunta di .attr ('valore'); all'estremità. Questo è il modo più semplice per ottenere effettivamente il valore da utilizzare in modo dinamico! Quindi il codice completo dovrebbe essere così. $("#testselect").find("option:contains('option-text')").attr('value'); in questo modo è possibile utilizzare un evento come .click()modificare un'impostazione.
ChrisKsag,

12

Questo è il metodo migliore per selezionare il testo nell'elenco a discesa.

$("#dropdownid option:contains(your selected text)").attr('selected', true);

3
Come con risposte simili, questo troverà un'opzione con this is your selected text plus more.
Teepeemm,

4

Ho provato alcune di queste cose fino a quando non ne ho avuto uno che funzionasse sia in Firefox che in IE. Questo è quello che mi è venuto in mente.

$("#my-Select").val($("#my-Select" + " option").filter(function() { return this.text == myText }).val());

un altro modo di scriverlo in un modo più leggibile:

var valofText = $("#my-Select" + " option").filter(function() {
    return this.text == myText
}).val();
$(ElementID).val(valofText);

pseudocodice:

$("#my-Select").val( getValOfText( myText ) );

Ha senso con le ultime versioni di jQuery
Fr0zenFyr

Che senso ha "#my-Select" + " option"? Perché non solo "#my-Select option"?
Teepeemm,

3

Usa il seguente

$('#select option:contains(ABC)').val();

1
il codice fornito potrebbe risolvere il problema, ma si prega di aggiungere una breve descrizione di come questo risolve il problema. Benvenuto in Stack Overflow, lettura consigliata Come rispondere .
Dan Beaulieu,

3
se ci sono alcune opzioni: ABC, ABCD, ABCDEF, allora?
Hungndv,

1

Funzionerà in jQuery 1.6 (nota i due punti prima della parentesi quadra aperta), ma fallisce nelle versioni più recenti (1.10 al momento).

$('#mySelect option:[text=abc]")

5
Interessante ma sfortunatamente non sembra funzionare (jQuery 1.10.2).
WynandB,

$("#mySelect option").filter(function() { return this.text == "abc"; });
Vorresti

1

Per jquery la versione 1.10.2 sotto ha funzionato per me

  var selectedText="YourMatchText";
    $('#YourDropdownId option').map(function () {
       if ($(this).text() == selectedText) return this;
      }).attr('selected', 'selected');
    });

1

Questo lavoro per me

$('#mySelect option:contains(' + value + ')').attr('selected', 'selected');

0

Questo funziona per me:

var result = $('#SubjectID option')
            .filter(function () 
             { return $(this).html() == "English"; }).val();

La resultvariabile restituirà l'indice del valore di testo corrispondente. Ora lo imposterò semplicemente usando il suo indice:

$('#SubjectID').val(result);

-1

O esegui l'iterazione attraverso le opzioni o inserisci lo stesso testo all'interno di un altro attributo dell'opzione e selezioni con quello.


-1

Questo funzionerà anche.

$ ('# test'). find ("seleziona opzione: contiene ('B')"). filtro (": selezionato");


2
Questo afferrerà anche l'opzione ABC.
Teepeemm

-1

Come descritto in questa risposta , puoi facilmente creare il tuo selettore per hasText. Questo ti permette di trovare l'opzione con$('#test').find('option:hastText("B")').val();

Ecco il metodo hasText che ho aggiunto:

 if( ! $.expr[':']['hasText'] ) {
     $.expr[':']['hasText'] = function( node, index, props ) {
       var retVal = false;
       // Verify single text child node with matching text
       if( node.nodeType == 1 && node.childNodes.length == 1 ) {
         var childNode = node.childNodes[0];
         retVal = childNode.nodeType == 3 && childNode.nodeValue === props[3];
       }
       return retVal;
     };
  }

-2

Questo funziona per me

var options = $(dropdown).find('option');
var targetOption = $(options).filter(
function () { return $(this).html() == value; });

console.log($(targetOption).val());

Grazie per tutti i post.

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.