Seleziona link per testo (corrispondenza esatta)


89

Utilizzando jQuery, voglio selezionare un collegamento che contiene esattamente un qualche tipo di testo. Per esempio:

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

Ho provato questo:

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

Ma sceglie il primo E il secondo collegamento. Voglio solo il primo collegamento, che contiene esattamente "Questo". Come lo posso fare?


Risposte:


138

Puoi farlo:

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

Riferimento: http://api.jquery.com/filter/


5
In entrambi i casi funzionerebbe, ma tendo a usare === perché corrisponde al valore e al tipo, cioè non costringe i tipi. stackoverflow.com/questions/359494/...
FishBasketGordo

1
Ti sei perso return. Devo cambiarlo infunction(index) { return (this.text === 'This One') }
Endy Tjahjono

Inoltre, puoi controllare la lunghezza del testo.
bestinamir

39

Un mio collega ha esteso jQuery con una funzione per fare questo:

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

Il risultato è che puoi selezionare qualcosa in base al testo esatto in questo modo:

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

Ciò lo rende facile, poiché non è necessario ricordare ogni volta la sintassi esatta. Il suo intero post è qui: jQuery Custom Selector per la selezione di elementi in base al testo esatto: textEquals


28

Per espandere la risposta di FishBasketGordo. Se stai cercando di effettuare la selezione su una grande quantità di elementi, usa :contains()prima per restringere e poi applica il filtro.

Ciò migliorerà la velocità complessiva:

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

Votato per velocità / efficienza. Inoltre, evita la necessità di $ .trim () spazi all'interno di .filter (..).
JoePC

8

ha dovuto modificare la soluzione di Nariman per essere:

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

Altrimenti non ha funzionato su Chrome (Linux)


6

Stavo usando l'estensione

$.expr[':'].textEquals

Ma ho scoperto che l'implementazione non funziona più con jQuery 1.7 (apparentemente un cambiamento in Sizzla.filter). Dopo aver lottato per un po 'di tempo per farlo funzionare, ho semplicemente scritto un plugin jQuery per ottenere lo stesso risultato.

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

Uso:

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

Volevo solo condividere, nel caso qualcun altro si imbattesse in questo (,


3

Quindi la risposta di Narnian funziona abbastanza bene. Usandolo in natura, tuttavia, mi sono imbattuto in alcuni problemi, in cui le cose che mi sarei aspettato di essere trovate non venivano trovate. Questo perché a volte c'è uno spazio bianco casuale che circonda il testo dell'elemento. È mia convinzione che se stai cercando "Hello World", vorresti comunque che corrispondesse a "Hello World" o anche "Hello World \ n". Quindi, ho appena aggiunto il metodo "trim ()" alla funzione, che rimuove gli spazi bianchi circostanti, e ha iniziato a funzionare meglio. Inoltre, ho modificato i nomi delle variabili per essere un po 'più chiari per la mia mente.

Nello specifico ...

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

E nota secondaria ... trim rimuove solo gli spazi bianchi prima e dopo il testo cercato. Non rimuove gli spazi vuoti nel mezzo delle parole. Credo che questo sia un comportamento desiderabile, ma potresti cambiarlo se lo desideri.


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

Mi sento come se mi mancasse qualcosa in base alla risposta di tutti gli altri al filtro, ma perché non selezionare semplicemente il primo elemento all'interno della matrice di elementi restituiti da "contiene"?

Funziona solo se sai che il primo collegamento ha la corrispondenza esatta che stai cercando. Altre risposte funzionano meglio, se non sei sicuro in quale ordine saranno i link.


Perché non sa sempre che quello che vuole è il primo
Cameron

La domanda chiede specificamente "Voglio solo il primo collegamento".
Michael Khalili

La domanda chiede la corrispondenza esatta, l'autore indica il primo elemento per spiegare quale elemento vuole.
dlopezgonzalez

2

Come ottenere il valore selezionato da 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")); - restituirà il valore del menu a discesa


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

1
Per favore aggiungi una spiegazione alla tua risposta.
Michał Perłakowski

la prima riga per selezionare qualsiasi collegamento con quel testo, la seconda e la terza riga cosa puoi fare con il collegamento per nasconderli o disabilitare il collegamento guarda il filtro nella documentazione jquery api.jquery.com/filter
David Fawzy

@DavidFawzy - scusa, umm ... cosa ?? Non penso che la seconda o la terza riga abbiano nulla a che fare con la domanda dell'OP - aggiunge solo confusione.
jbyrd

2

Spiacenti, se questo corrisponde esattamente alla risposta di qualcuno sopra,

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

Ecco alcuni output nella console della pagina dei risultati di ricerca di 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

Ha anche il supporto per la distinzione tra maiuscole e minuscole e non utilizza :contains()

Modifica (22 maggio 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()
         }
      })
   }
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.