90 votes

Sélectionnez le lien par le texte (correspondance exacte)

Avec jQuery, je souhaite sélectionner un lien contenant exactement un type de texte. Par exemple:

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

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 "Celui-ci". Comment puis je faire ça?

140voto

FishBasketGordo Points 14957

Tu peux le faire:

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

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

39voto

Narnian Points 2048

Un collègue de la mine étendue de jQuery avec une fonction pour faire cela:

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

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

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

Cela rend plus facile, puisque vous n'avez pas à se souvenir de la syntaxe exacte à chaque fois. L'ensemble de son post est ici: jQuery Personnalisé Sélecteur pour la sélection d'éléments par le texte exact :textEquals

28voto

djhansel Points 31

Pour développer la réponse de FishBasketGordo. Si vous essayez de sélectionner un grand nombre d’éléments, utilisez d’abord :contains() pour affiner et appliquer ensuite le filtre.

Cela améliorera la vitesse globale:

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

8voto

archer Points 2273

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, ne fonctionne pas sur chrome (Linux)

6voto

Alvis Points 384

J'utilisais l'extension

 $.expr[':'].textEquals
 

Mais j’ai constaté que l’implémentation ne fonctionnait 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 à cela (,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X