Sélectionnez le lien par texte (correspondance exacte)

En utilisant jQuery, je veux sélectionner un lien qui contient exactement du texte. Par exemple:

This One

"This One?"

Unlikely

J’ai essayé ceci:

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

Mais il choisit le premier et le deuxième lien. Je veux juste le premier lien, qui contient exactement “This One”. Comment puis je faire ça?

Tu peux le faire:

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

Référence: http://api.jquery.com/filter/

Un de mes collègues a étendu jQuery avec une fonction pour le faire:

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

Le résultat est que vous pouvez sélectionner quelque chose par le texte exact de cette façon:

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

Cela facilite les choses, car vous n’avez pas à vous souvenir de la syntaxe exacte à chaque fois. Son post entier est ici: Sélecteur personnalisé jQuery pour sélectionner des éléments par texte exact: textEquals

Pour développer la réponse de FishBasketGordo. Si vous essayez d’effectuer la sélection sur une grande quantité d’éléments, utilisez :contains() pour réduire puis appliquer le filtre.

Cela améliorera la vitesse globale:

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

a dû modifier la solution de Nariman pour être:

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

Sinon, cela ne fonctionnait pas sur chrome (Linux)

J’utilisais l’extension

 $.expr[':'].textEquals 

Mais j’ai constaté que l’implémentation ne fonctionne plus avec jQuery 1.7 (apparemment un changement dans Sizzla.filter). Après avoir lutté pendant un certain temps pour que cela fonctionne, j’ai simplement écrit un plugin jQuery pour accomplir la même chose.

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

Utilisation:

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

Je voulais juste partager, au cas où quelqu’un d’autre se heurterait à ça (,

Comment obtenir la valeur sélectionnée à partir d’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")); – il retournera la valeur de la liste déroulante

La réponse de Narnian fonctionne donc très bien. En l’utilisant à l’état sauvage, j’ai rencontré quelques problèmes, où les choses auxquelles je m’attendais à être trouvées n’étaient pas trouvées. C’était parce que parfois il y avait un espace blanc aléatoire autour du texte de l’élément. Je pense que si vous recherchez “Hello World”, vous souhaitez toujours qu’il corresponde à “Hello World”, ou même à “Hello World \ n”. Ainsi, j’ai simplement ajouté la méthode “sortingm ()” à la fonction, qui supprime les espaces blancs environnants, et cela a commencé à mieux fonctionner. De plus, j’ai modifié les noms de variables pour être un peu plus clair.

Plus précisément…

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

Et secondaire note … sortingm supprime uniquement les espaces avant et après le texte recherché. Il ne supprime pas les espaces au milieu des mots. Je crois que c’est un comportement souhaitable, mais vous pourriez changer cela si vous le vouliez.

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

Désolé, si cela correspond exactement à la réponse ci-dessus,

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

Voici quelques résultats dans la console de la page de résultats de recherche de Linkedin.

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

    Il prend également en charge la sensibilité à la casse et n’utilise pas :contains()

    Edit (22 mai 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() } }) } 
     $('a:contains("This One")')[0]; 

    J’ai l’impression qu’il me manque quelque chose en fonction de la réponse de chacun à filtrer, mais pourquoi ne pas simplement sélectionner le premier élément du tableau d’éléments renvoyés par «contains»?

    Cela fonctionne uniquement si vous savez que le premier lien correspond exactement à ce que vous recherchez. Les autres réponses fonctionnent mieux si vous ne savez pas dans quel ordre les liens seront.