jquery jquery-1.6

jquery - Seleccionar enlace por texto(coincidencia exacta)



contains jquery (10)

Usando jQuery, quiero seleccionar un enlace que contenga exactamente algún tipo de texto. Por ejemplo:

<p><a>This One</a></p> <p><a>"This One?"</a></p> <p><a>Unlikely</a></p>

He intentado esto:

$(''a:contains("This One")'')

Pero elige el primer Y el segundo enlace. Solo quiero el primer enlace, que contiene exactamente "This One". ¿Cómo puedo hacer eso?


Cómo obtener el valor seleccionado de un drop-dwon:

$.fn.textEquals = function (text) { var match = false; var values=""; $(this).each(function () { if ($(this).text().match("^" + text + "$")) { values=$(this).val(); match = true; return false; } }); return values; };

console.log($("option").textEquals("Option One")); - Devolverá el valor del menú desplegable


Entonces la respuesta de Narnian funciona bastante bien. Sin embargo, al usarlo en la naturaleza, me encontré con algunos problemas, donde las cosas que esperaba encontrar no se encontraban. Esto fue porque a veces hay un espacio en blanco al azar que rodea el texto del elemento. Creo que si buscas "Hello World", aún deseas que coincida con "Hello World", o incluso "Hello World / n". Por lo tanto, acabo de agregar el método "trim ()" a la función, que elimina el espacio en blanco circundante, y comenzó a funcionar mejor. Además, modifiqué los nombres de las variables para ser un poco más claros para mi mente.

Específicamente...

$.expr['':''].textEquals = function(el, i, m) { var searchText = m[3]; var match = $(el).text().trim().match("^" + searchText + "$") return match && match.length > 0; }

Y nota secundaria ... recortar solo elimina el espacio en blanco antes y después del texto buscado. No elimina espacios en blanco en el medio de las palabras. Creo que este es un comportamiento deseable, pero podrías cambiar eso si quisieras.


Estaba usando la extensión

$.expr['':''].textEquals

Pero descubrí que la implementación ya no funciona con jQuery 1.7 (aparentemente un cambio en Sizzla.filter). Después de luchar por un tiempo para hacerlo funcionar, simplemente escribí un plugin de jQuery para lograr lo mismo.

$.fn.textEquals = function (text) { var match = false; $(this).each(function () { if ($(this).text().match("^" + escapeRegex(text) + "$")) { match = true; return false; } }); return match; };

Utilizar:

$(".ui-autocomplete li").textEquals(''Exact Text to Match'');

Solo quería compartir, en caso de que alguien más se encuentre con esto (,


Lo sentimos, si esto coincide exactamente con la respuesta de cualquiera de arriba,

$.fn.equalsText = function (text, isCaseSensitive) { return $(this).filter(function () { if (isCaseSensitive) { return $(this).text() === text } else { return $(this).text().toLowerCase() === text.toLowerCase() } }) }

Aquí hay algunos resultados en la consola de la página de resultados de búsqueda de Linkedin.

$("li").equalsText("Next >", false) [<li class=​"next">​…​</li>​] // Output $("li").equalsText("next >", false) [<li class=​"next">​…​</li>​] // Output $("li").equalsText("Next >", true) [<li class=​"next">​…​</li>​] // Output $("li").equalsText("next >", true) [] // Output

También tiene soporte de sensibilidad de mayúsculas y minúsculas y no usa :contains()

Editar (22 de mayo de 2017): -

$.fn.equalsText = function (textOrRegex, isCaseSensitive) { return $(this).filter(function () { var val = $(this).text() || this.nodeValue if (textOrRegex instanceof RegExp) { return textOrRegex.test(val) } else if (isCaseSensitive) { return val === textOrRegex } else { return val.toLowerCase() === textOrRegex.toLowerCase() } }) }


Para ampliar la respuesta de FishBasketGordo. Si intenta hacer la selección en una gran cantidad de elementos, use :contains() primero para restringir y luego aplicar el filtro.

Esto mejorará la velocidad general:

$(''a:contains("This One")'').filter(function(index) { return $(this).text() === "This One"; });



Un compañero de trabajo extendió jQuery con una función para hacer esto:

$.expr['':''].textEquals = function(a, i, m) { return $(a).text().match("^" + m[3] + "$"); };

El resultado es que puede seleccionar algo por texto exacto de esta manera:

$("label:textEquals(''Exact Text to Match'')");

Esto lo hace fácil, ya que no tiene que recordar la sintaxis exacta cada vez. Su publicación completa está aquí: jQuery Custom Selector para seleccionar elementos por texto exacto: textEquals


tuvo que modificar la solución de Nariman para ser:

$.expr['':''].textEquals = function(a, i, m) { var match = $(a).text().match("^" + m[3] + "$") return match && match.length > 0; }

De lo contrario, no funcionó en Chrome (Linux)


$(''a:contains("This One")'')[0];

Siento que me falta algo basado en la respuesta de todos los demás para filtrar, pero ¿por qué no simplemente seleccionar el primer elemento dentro de la matriz de elementos que devuelve ''contiene''?

Esto funciona, solo si sabes que el primer enlace tiene la coincidencia exacta que estás buscando. Otras respuestas funcionan mejor, si no está seguro en qué orden estarán los enlaces.


var link = $(''a'').filter(function(index) { return $(this).text() === "Availability"; }); $(link).hide(); $(link).removeAttr(''href'');