jQuery: znajdź element po tekście

308

Czy ktoś może mi powiedzieć, czy można znaleźć element na podstawie jego zawartości, a nie identyfikatora lub klasy ?

Próbuję znaleźć elementy, które nie mają odrębnych klas lub identyfikatorów. (Następnie muszę znaleźć element nadrzędny tego elementu).

sisko
źródło

Odpowiedzi:

432

Możesz użyć :containsselektora, aby uzyskać elementy na podstawie ich zawartości.

Demo tutaj

$('div:contains("test")').css('background-color', 'red');
<div>This is a test</div>
<div>Another Div</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

Rakieta Hazmat
źródło
2
Świetnie, ale wielkość liter ma znaczenie. Czy istnieje możliwość wyszukiwania bez rozróżniania wielkości liter?
Dipu Raj,
123
@DipuRaj: Musisz użyć .filterzamiast tego. $('div').filter(function(){ return $(this).text().toLowerCase() === 'test';})
Rocket Hazmat
5
Tak, skorzystaj z oceny @RocketHazmat , powiedz, że masz 5 elementów z prefiksem „Zarejestruj umowę”, a każdy ma sufiks liczbowy. Ostatecznie wybierzesz je wszystkie , gdy w rzeczywistości chcesz tylko element z tekstem: „Zarejestruj umowę 26” .
Feng Huo
1
Chociaż: zawiera rozróżnia małe i wielkie litery, zadziałało dla mnie, ponieważ przekazałem dokładny ciąg tekstowy do znalezienia.
Francisco Quintero,
1
W przypadku, gdy pomaga to komuś, kto lubi używać spacji w swoich parenach, następujące działania nie działają:$('div:contains( "test" )').css('background-color', 'red');
M Katz
92

W dokumentacji jQuery jest napisane:

Dopasowany tekst może pojawić się bezpośrednio w wybranym elemencie, w dowolnym potomku tego elementu lub w kombinacji

Dlatego nie wystarczy użyć :contains() selektora , musisz również sprawdzić, czy szukany tekst jest bezpośrednią zawartością elementu, na który celujesz, coś takiego:

function findElementByText(text) {
    var jSpot = $("b:contains(" + text + ")")
                .filter(function() { return $(this).children().length === 0;})
                .parent();  // because you asked the parent of that element

    return jSpot;
}
Yoav Barnea
źródło
3
Właśnie natrafiłem na ten problem. To powinno być wyższe.
DickieBoy
2
Takie rozwiązanie może się nie powieść w następującym scenariuszu: <li>Hello <a href='#'>World</a>, How Are You. . Tutaj, jeśli Howjest przeszukiwany, warunek się nie powiedzie.
me_digvijay
23

Faceci, wiem, że to stare, ale hej mam to rozwiązanie, które moim zdaniem działa lepiej niż wszyscy. Przede wszystkim eliminuje rozróżnianie wielkości liter, które jquery: zawiera () jest dostarczane z:

var text = "text";

var search = $( "ul li label" ).filter( function ()
{
    return $( this ).text().toLowerCase().indexOf( text.toLowerCase() ) >= 0;
}).first(); // Returns the first element that matches the text. You can return the last one with .last()

Mam nadzieję, że ktoś w najbliższej przyszłości uzna to za pomocne.

Morgs
źródło
18

Odpowiedź rakiety nie działa.

<div>hhhhhh
<div>This is a test</div>
<div>Another Div</div>
</div>

Po prostu zmodyfikowałem tutaj jego DEMO i widać, że wybrany jest główny katalog DOM.

$('div:contains("test"):last').css('background-color', 'red');

dodaj selektor „ : ostatni ” w kodzie, aby to naprawić.

Terry Lin
źródło
Działa to najlepiej, gdy selektor zwraca wiele wyników i konieczne jest zawężenie go do określonego elementu, do którego nie ma atrybutu „Id”.
Tahir Khalid
14

Najlepszy sposób moim zdaniem.

$.fn.findByContentText = function (text) {
    return $(this).contents().filter(function () {
        return $(this).text().trim() == text.trim();
    });
};
rplaurindo
źródło
8

Tak, użyj containsselektora jQuery .

Alex Turpin
źródło
10
Eee, nie, nie: „zawiera:” nie pasuje dokładnie, tylko czy igła jest zawarta (stąd nazwa) w stogu siana ... jak powiedzieli inni
Mike Gryzonie
3
To nie jest odpowiedź.
lharby
4

Poniższy jQuery wybiera węzły div, które zawierają tekst, ale nie mają potomków, które są węzłami liści drzewa DOM.

$('div:contains("test"):not(:has(*))').css('background-color', 'red');
<div>div1
<div>This is a test, nested in div1</div>
<div>Nested in div1<div>
</div>
<div>div2 test
<div>This is another test, nested in div2</div>
<div>Nested in div2</div>
</div>
<div>
div3
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

Nicholas Sushkin
źródło
To najlepsza odpowiedź!
Calciol,