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



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>


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;
}

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.


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.


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

8

Ja, verwenden Sie den jQuery- containsSelektor.


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>


Das ist die beste Antwort!
Calciol
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.