jQuery: Element anhand von Text suchen

308

Kann mir jemand sagen, ob es möglich ist, ein Element anhand seines Inhalts und nicht anhand einer ID oder Klasse zu finden ?

Ich versuche Elemente zu finden, die keine unterschiedlichen Klassen oder IDs haben. (Dann muss ich dann das übergeordnete Element dieses Elements finden.)

Sisko
quelle

Antworten:

432

Sie können den :containsSelektor verwenden, um Elemente basierend auf ihrem Inhalt abzurufen.

Demo hier

$('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>

Rakete Hazmat
quelle
2
Großartig, aber es wird zwischen Groß- und Kleinschreibung unterschieden. Können wir trotzdem eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchführen?
Dipu Raj
123
@ DipuRaj: Du müsstest .filterstattdessen verwenden. $('div').filter(function(){ return $(this).text().toLowerCase() === 'test';})
Rocket Hazmat
5
Ja, bitte verwenden Sie den Appraoch, den @RocketHazmat verwendet. Angenommen , Sie haben 5 Elemente, denen alle "Vertrag registrieren" vorangestellt sind, und jedes hat ein Nummernsuffix. Am Ende werden Sie alle auswählen , wenn Sie in Wirklichkeit nur das Element mit dem Text "Vertrag 26 registrieren" möchten .
Feng Huo
1
Obwohl: enthält zwischen Groß- und Kleinschreibung unterscheidet, hat es bei mir funktioniert, da ich die genaue zu findende Textzeichenfolge übergeben habe.
Francisco Quintero
1
Falls es jemand anderem hilft, der gerne Leerzeichen in seinen Eltern benutzt, funktioniert Folgendes nicht :$('div:contains( "test" )').css('background-color', 'red');
M Katz
92

In der jQuery-Dokumentation heißt es:

Der übereinstimmende Text kann direkt im ausgewählten Element, in einem der Nachkommen dieses Elements oder in einer Kombination angezeigt werden

Daher reicht es nicht aus, dass Sie den :contains() Selektor verwenden . Sie müssen auch überprüfen, ob der gesuchte Text der direkte Inhalt des Elements ist, auf das Sie abzielen.

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
quelle
3
Bin gerade auf genau dieses Problem gestoßen. Dies sollte höher sein.
DickieBoy
2
Diese Lösung kann in folgendem Szenario fehlschlagen : <li>Hello <a href='#'>World</a>, How Are You. . Wenn Howhier gesucht wird, wird die Bedingung meiner Meinung nach fehlschlagen.
me_digvijay
23

Fellas, ich weiß, das ist alt, aber hey, ich habe diese Lösung, die meiner Meinung nach besser funktioniert als alle anderen. In erster Linie überwindet die Groß- und Kleinschreibung, mit der die jquery: enthält () geliefert wird mit:

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()

Hoffe, jemand in naher Zukunft findet es hilfreich.

Morgs
quelle
18

Rockets Antwort funktioniert nicht.

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

Ich habe hier einfach sein DEMO geändert und Sie können sehen, dass das Root-DOM ausgewählt ist.

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

Fügen Sie im Code den Selektor " : last " hinzu, um dies zu beheben.

Terry Lin
quelle
Dies funktioniert am besten, wenn der Selektor mehrere Ergebnisse zurückgibt und Sie ihn auf ein bestimmtes Element eingrenzen müssen, auf das Sie kein "Id" -Attribut verweisen können.
Tahir Khalid
14

Bester Weg meiner Meinung nach.

$.fn.findByContentText = function (text) {
    return $(this).contents().filter(function () {
        return $(this).text().trim() == text.trim();
    });
};
rplaurindo
quelle
8

Ja, verwenden Sie den jQuery- containsSelektor.

Alex Turpin
quelle
10
ähm, nein, nicht: 'enthält:' stimmt nicht genau überein, nur ob die Nadel im Heuhaufen enthalten ist (daher der Name) ... wie andere hier gesagt haben
Mike Nagetier
3
Dies ist keine Antwort.
lharby
4

In der folgenden jQuery werden Div-Knoten ausgewählt, die Text enthalten, aber keine untergeordneten Knoten haben. Dies sind die Blattknoten des DOM-Baums.

$('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
quelle
Das ist die beste Antwort!
Calciol