jQuery:テキストで要素を検索する


308

idクラスではなく、その内容に基づいて要素を見つけることが可能かどうか誰かに教えてもらえますか?

異なるクラスやIDを持たない要素を見つけようとしています。(次に、その要素の親を見つける必要があります。)



回答:


432

:containsセレクターを使用して、コンテンツに基づいて要素を取得できます。

デモはこちら

$('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
すばらしいですが、大文字と小文字が区別されます。とにかく、大文字と小文字を区別しない検索を実行できますか?
Dipu Raj

123
@DipuRaj:.filter代わりに使用する必要があります。 $('div').filter(function(){ return $(this).text().toLowerCase() === 'test';})
ロケットハズマット

5
はい、@ RocketHazmatが使用する手法を使用してください。たとえば、「Register Contract」という接頭辞が付いた 5つの要素があり、それぞれに番号のサフィックスが付いているとします。実際には、「Register Contract 26」というテキストのみの要素が必要な場合は、それらすべてを選択することになります。
Feng Huo

1
:containsは大文字と小文字を区別しますが、正確なテキスト文字列を渡して検索したので、うまくいきました。
Francisco Quintero 2015

1
場合には、それは彼らの括弧内のスペースを使用するのが好き誰かが助け、次の処理が行われていない作品:$('div:contains( "test" )').css('background-color', 'red');
Mカッツ

92

jQueryドキュメントではそれは言う:

一致するテキストは、選択した要素内、その要素の子孫のいずれか、または組み合わせで直接表示できます

したがって、:contains() selectorを使用するだけでは十分ではなく、検索するテキストが、対象とする要素の直接のコンテンツであるかどうかを確認する必要もあります。

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
ちょうどこの正確な問題に遭遇しました。これはもっと高いはずです。
DickieBoy 2015

2
このソリューションは、次のシナリオでは失敗する可能性があります<li>Hello <a href='#'>World</a>, How Are You. 。ここHowで検索していると条件が崩れると思います。
me_digvijay 2017

23

Fellas、私はこれが古いことを知っていますが、私はこのソリューションを持っています。何よりもまず、jquery:contains()に同梱されている大文字と小文字の区別を克服します。

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

近い将来に誰かがそれが役に立てば幸いです。


18

ロケットの答えは機能しません。

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

ここで彼のデモを変更しただけで、ルートDOMが選択されていることがわかります。

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

これを修正するには、コードに「:last」セレクターを追加します。


これは、セレクタが複数の結果を返し、参照する「Id」属性がない特定の要素に絞り込む必要がある場合に最適に機能します。
Tahir Khalid 2016年

14

私の意見では最良の方法です。

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


4

次のjQueryは、テキストが含まれているがDOMツリーのリーフノードである子がないdivノードを選択します。

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


これが一番の答えです!
カルシオール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.