Seleziona il link per testo (corrispondenza esatta)

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

This One

"This One?"

Unlikely

Ho provato questo:

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

Ma seleziona il primo AND il secondo link. Voglio solo il primo link, che contiene esattamente “This One”. Come lo posso fare?

Puoi farlo:

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

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

Un mio collega ha esteso jQuery con una funzione per farlo:

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

Il risultato è che puoi selezionare qualcosa con il testo esatto in questo modo:

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

Questo lo rende facile, dal momento che non devi ricordare la syntax esatta ogni volta. Il suo intero post è qui: jQuery Custom Selector per selezionare gli elementi in base al testo esatto: textEquals

Per espandere la risposta di FishBasketGordo. Se si sta tentando di effettuare la selezione su una grande quantità di elementi, usare :contains() prima cosa restringere e quindi applicare il filtro.

Ciò migliorerà la velocità generale:

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

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)

Stavo usando l’estensione

 $.expr[':'].textEquals 

Ma ho trovato che l’implementazione non funziona più con jQuery 1.7 (apparentemente un cambiamento in Sizzla.filter). Dopo aver lottato per qualche tempo per farlo funzionare, ho semplicemente scritto un plugin jQuery per realizzare lo stesso.

 $.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 qualcuno si imbattesse in questo (,

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

Quindi la risposta di Narnian funziona abbastanza bene. Usandolo in natura, però, mi sono imbattuto in alcuni problemi, dove le cose che mi sarei aspettato di trovare 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”, vorrai comunque che corrisponda a “Hello World”, o anche “Hello World \ n”. Così, 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ù chiaro nella mia mente.

In particolare …

 $.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 elimina solo gli spazi bianchi prima e dopo il testo cercato. Non rimuove gli spazi bianchi nel mezzo delle parole. Credo che questo sia un comportamento desiderabile, ma potresti cambiarlo se lo volessi.

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

Scusa, 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 risultati nella console della pagina dei risultati della ricerca di Linkedin.

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

    Ha anche il supporto per la distinzione tra maiuscole e minuscole e non sta usando :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() } }) } 
     $('a:contains("This One")')[0]; 

    Mi sento come se mi mancasse qualcosa in base alla risposta di tutti gli altri per filtrare, ma perché non selezionare solo il primo elemento all’interno della matrice di elementi che viene restituito da ‘contiene’?

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