回答:
jQueryにはcontainsメソッドがあります。ここにあなたのためのスニペットがあります:
<script type="text/javascript">
$(function() {
var foundin = $('*:contains("I am a simple string")');
});
</script>
上記のセレクタは、ターゲット文字列を含むすべての要素を選択します。foundinは、一致した要素を含むjQueryオブジェクトになります。https://api.jquery.com/contains-selector/の API情報を参照してください。
'*'ワイルドカードで注意すべき点の1つは、htmlやbody要素を含むすべての要素を取得することです。そのため、jQueryおよびその他の場所でのほとんどの例では、$( 'div:contains( "I am a simple string")')を使用しています。
通常、jQueryセレクターはDOMの「テキストノード」内を検索しません。ただし、.contents()関数を使用する場合、テキストノードが含まれるため、nodeTypeプロパティを使用してテキストノードのみをフィルター処理し、nodeValueプロパティを使用してテキスト文字列を検索できます。
$( '*'、 'body') .andSelf() .contents() .filter(function(){ this.nodeType === 3を返します。 }) .filter(function(){ //テキストに「単純な文字列」が含まれている場合のみ一致 これを返すthis.nodeValue.indexOf( 'simple string')!= -1; }) .each(function(){ // this.nodeValueで何かをします });
.andSelf()
いるのか戸惑う。api.jquery.com/andSelfから: "jQueryオブジェクトは、一致した要素セットへの変更を追跡する内部スタックを維持します。DOMトラバーサルメソッドの1つが呼び出されると、新しい要素セットがスタックにプッシュされます。以前の要素のセットも必要であり、.andSelf()が役立ちます。」以前のコンテキストが表示されません。何が欠けていますか?
これにより、「I am a simple string」を含むリーフ要素のみが選択されます。
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).css("border","solid 2px red") });
以下をアドレスバーに貼り付けてテストします。
javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;
「私は単純な文字列」だけを取得したい場合。まず、テキストを要素でラップします。
$('*:contains("I am a simple string")').each(function(){
if($(this).children().length < 1)
$(this).html(
$(this).text().replace(
/"I am a simple string"/
,'<span containsStringImLookingFor="true">"I am a simple string"</span>'
)
)
});
そしてこれを行います。
$('*[containsStringImLookingFor]').css("border","solid 2px red");
検索するテキストに最も近いノードが必要な場合は、これを使用できます。
$('*:contains("my text"):last');
これは、HTMLが次のようになっている場合でも機能します。
<p> blah blah <strong>my <em>text</em></strong></p>
上記のセレクターを使用すると、<strong>
タグが見つかります。これは、その文字列全体を含む最後のタグだからです。
<p>my text <b>my text</b></p>
- <b>
タグの祖先を削除すると、他の試合に負ける
Tony Millerの答えに追加すると、90%が私が探していたものの、それでも機能しませんでした。.length > 0;
彼のコードの最後に追加すると、スクリプトが機能します。
$(function() {
var foundin = $('*:contains("I am a simple string")').length > 0;
});
foundin += '*';
この機能は動作するはずです。基本的には、リーフノードの個別のリストを取得するまで、再帰的なルックアップを実行します。
function distinctNodes(search, element) {
var d, e, ef;
e = [];
ef = [];
if (element) {
d = $(":contains(\""+ search + "\"):not(script)", element);
}
else {
d = $(":contains(\""+ search + "\"):not(script)");
}
if (d.length == 1) {
e.push(d[0]);
}
else {
d.each(function () {
var i, r = distinctNodes(search, this);
if (r.length === 0) {
e.push(this);
}
else {
for (i = 0; i < r.length; ++i) {
e.push(r[i]);
}
}
});
}
$.each(e, function () {
for (var i = 0; i < ef.length; ++i) {
if (this === ef[i]) return;
}
ef.push(this);
});
return ef;
}