¿Qué selector necesito para seleccionar una opción por su texto?

207

Necesito verificar si a <select>tiene una opción cuyo texto es igual a un valor específico.

Por ejemplo, si hay un <option value="123">abc</option>, estaría buscando "abc".

¿Hay un selector para hacer esto?

Estoy buscando algo similar $('#select option[value="123"]');pero para el texto.

Granizo
fuente
Hmm ... la hasrespuesta en SLaks es útil, pero el punto en la respuesta de Floyds también es bueno ... No sé qué aceptar.
Hailwood
Además, ¿son sensibles a mayúsculas y minúsculas? (Estoy buscando insensibilidad a mayúsculas y minúsculas y siempre puedo convertir a menor)
Hailwood
1
Uso la función principal de JavaScript .toLowerCase () y comparo, si se requiere mayúsculas y minúsculas. Además, acepte como respuesta la que sea más útil para su pregunta. :)
Hari Pachuveetil
¿No funciona para un menú desplegable que tiene API multiseleccionada? Intenté todas las soluciones posibles, pero no tuve suerte. Estoy usando la API desplegable multiselect de eric hynd. ¿Alguien puede resolver este problema?
Chaitanya Chandurkar

Respuestas:

320

Esto podría ayudar:

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

Violín de demostración

Esto le daría la opción con texto By no las que tienen texto que contiene B. Espero que esto ayude

Para versiones recientes de jQuery, lo anterior no funciona. Como comenta Quandary a continuación, esto es lo que funciona para jQuery 1.9.1:

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

Violín actualizado

Hari Pachuveetil
fuente
1
esto no funciona con las últimas versiones de jquery (si elimina 'value =' de <opción>)
KevinDeus
27
@ KevinDeus: ¿Por qué el voto negativo? La respuesta fue para la versión de jQuery entonces!
Hari Pachuveetil
11
En su lugar, use $ ('# opción de prueba'). Filter (function () {return $ (this) .html () == "B";}). Val ();
Stefan Steiger
84
@Quandary Aún así, no es una razón válida para rechazar la respuesta cuando bastaría un breve comentario. ¿O esperas que vuelva a probar todas sus respuestas para cada nuevo lanzamiento de jQuery?
WynandB
2
Creo que el voto negativo se debe al hecho de que el ejemplo anterior solo encuentra el valor seleccionado y no establece el valor seleccionado.
nivs1978
133

Puede usar el :contains()selector para seleccionar elementos que contienen texto específico.
Por ejemplo:

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

Para verificar si un <select>elemento dado tiene esa opción, use el .has()método :

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

Para encontrar todos los <select>correos electrónicos que contienen dicha opción, use el :has()selector :

$('select:has(option:contains(abc))')
SLaks
fuente
3
:containsno es definitivo ahora, ¿verdad?
Hari Pachuveetil
¿Cuál es el problema exactamente con contiene?
Ogier Schelvis
¿Cómo harías esto solo con las opciones seleccionadas?
toddmo
¿No tiene esto también una opción 123abcdef?
Teepeemm
@Teepeemm Sí, esa es la diferencia entre las dos respuestas principales. Las comprobaciones superiores solo devuelven la opción con solo el texto específico, este devuelve la opción que contiene, pero no es solo, ese texto específico. Lo cual, por coincidencia, es lo que realmente necesito en este momento, así que estoy muy contento de haberlo publicado.
Lee A.
30

Ninguna de las sugerencias anteriores funcionó para mí en jQuery 1.7.2 porque estoy tratando de establecer el índice seleccionado de la lista en función del valor de un cuadro de texto, y algunos valores de texto están contenidos en múltiples opciones. Terminé usando lo siguiente:

$('#mySelect option:contains(' + value + ')').each(function(){
    if ($(this).text() == value) {
        $(this).attr('selected', 'selected');
        return false;
    }
    return true;
});
Dr. C. Hilarius
fuente
1
Creo que esta es la mejor respuesta porque en realidad devuelve los resultados correctos. Pero no puedo evitar pensar que omitir por containscompleto puede acelerar las cosas.
styfle
Esto funcionó para mí, pero en mi escenario pude hacer clic en editar en una cuadrícula varias veces, por lo que tuve que eliminar el atributo seleccionado cuando no había coincidencia; de lo contrario, la primera opción seleccionada permanecería para las ediciones posteriores. else {$ (this) .attr ('selected', ''); falso retorno; }
especialmente el
Esta solución funcionó para mí, pero en lugar de establecer el atributo de opción, para cambiar realmente el menú de selección que necesitaba hacer: $(this).parent().val($(this).val()); Probablemente podría hacer ambas cosas, pero para mí, configurar solo el padre val()hizo el truco.
billynoah
20

Me enfrenté al mismo problema a continuación: el código de trabajo:

$("#test option").filter(function() {
    return $(this).text() =='Ford';
}).prop("selected", true);

Demostración: http://jsfiddle.net/YRBrp/83/

Jaydeep Shil
fuente
15

Esto funcionó para mí: $("#test").find("option:contains('abc')");

Phillip Dennis
fuente
3
Debería agregar una explicación de por qué está funcionando también.
Hannes Johansson
@HannesJohansson O al menos debería explicar cómo es diferente o agrega algo nuevo a la respuesta de SLaks que es casi cinco años mayor. ; ^)
ruffin
44
Asegúrese de darse cuenta de que esto también encontrará esta opción: <option> abcd </option>.
Charles
Gracias, esto es definitivamente correcto y lo que todos se perdieron es agregar .attr ('valor'); hasta el final. ¡Esta es la forma más fácil de obtener el valor para usar de manera dinámica! Entonces el código completo debería gustarle. $("#testselect").find("option:contains('option-text')").attr('value'); de esa manera puede usar un evento como .click()cambiar una configuración.
ChrisKsag
12

Este es el mejor método para seleccionar texto en la lista desplegable.

$("#dropdownid option:contains(your selected text)").attr('selected', true);
sreejesh
fuente
3
Al igual que con respuestas similares, esto encontrará una opción con this is your selected text plus more.
Teepeemm
4

Probé algunas de estas cosas hasta que conseguí una para trabajar tanto en Firefox como en IE. Esto es lo que se me ocurrió.

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

Otra forma de escribirlo de una manera más legible:

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

Pseudocódigo:

$("#my-Select").val( getValOfText( myText ) );
usuario2561852
fuente
Tiene sentido con las últimas versiones de jQuery
Fr0zenFyr
¿De qué sirve "#my-Select" + " option"? ¿Por qué no solo "#my-Select option"?
Teepeemm
3

Usar siguiente

$('#select option:contains(ABC)').val();
Dadaso Zanzane
fuente
1
el código que proporcionó puede resolver el problema, pero agregue una breve descripción de cómo resuelve el problema. Bienvenido a Stack Overflow, lectura recomendada Cómo responder .
Dan Beaulieu
3
si hay algunas opciones: ABC, ABCD, ABCDEF, entonces?
hungndv
1

Esto funcionará en jQuery 1.6 (tenga en cuenta dos puntos antes del paréntesis de apertura), pero falla en las versiones más recientes (1.10 en ese momento).

$('#mySelect option:[text=abc]")
Bartosz Firyn
fuente
55
Interesante pero desafortunadamente no parece funcionar (jQuery 1.10.2).
WynandB
Que se quiere incluir algo así como que $("#mySelect option").filter(function() { return this.text == "abc"; });el trabajo con la voluntad últimas versiones de jQuery .. O probablemente alguna otra manera, que prefiere utilizar ..
Fr0zenFyr
1

Para jquery versión 1.10.2 a continuación funcionó para mí

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

Este trabajo para mi

$('#mySelect option:contains(' + value + ')').attr('selected', 'selected');
Carlos Castañeda
fuente
0

Esto funciona para mi:

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

La resultvariable devolverá el índice del valor de texto coincidente. Ahora lo configuraré usando su índice:

$('#SubjectID').val(result);
Willy David Jr
fuente
-1

O iteras por las opciones, o pones el mismo texto dentro de otro atributo de la opción y seleccionas con eso.

dekomote
fuente
-1

Esto también funcionará.

$ ('# test'). find ("opción de selección: contiene ('B')"). filter (": selected");

Tjcool
fuente
2
Esto también tomará la opción ABC.
Teepeemm
-1

Como se describe en esta respuesta , puede crear fácilmente su propio selector para hasText. Esto le permite encontrar la opción con$('#test').find('option:hastText("B")').val();

Aquí está el método hasText que agregué:

 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;
     };
  }
wbdarby
fuente
-2

Esto funciona para mi

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

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

Gracias por todas las publicaciones.

jayson.centeno
fuente