2013-08-06 18 views
9

が含まれている要素だけを選択:jQueryの素敵な:contains selectorを使用してだから私はこのような何か持っている直接テキスト

<div class="main"> 
    <div class="useless"> 
    text I don't want.  
    </div> 
    <div class="useless"> 
    text I don't want.  
    </div> 
    <div class="narrow"> 
    text I'm searching for 
    </div> 
    <div class="useless"> 
    text I don't want.  
    </div> 
    <div class="useless"> 
    text I don't want.  
    </div> 
</div> 

を、私はキーワードを検索することができますが、それは親と子の両方を返します。

私が検索している単語が直接含まれている要素のみを返すことができます。

これは以前の試みとしてthis linkを示唆していましたが、すべてのドミノノードをクロールしており、不明瞭なコードがたくさんあるため、非常に厄介なようです。

$("div:contains('searching')").filter(function() { 
    return (
    $(this).clone() //clone the element 
    .children() //select all the children 
    .remove() //remove all the children 
    .end() //again go back to selected element 
    .filter(":contains('searching')").length > 0) 
}).css('border', 'solid 1px black'); 

Iを:

+3

これは、あなたが参照した質問の欺瞞としてフラグを立てます。あなたが与えた理由のために、あなたがそこでの答えに満足していないことを感謝しながら、それは同じ質問であり、他の質問に与えられていない特定の要件を与えていません。あなたがそうすることができれば、適切な行動措置はおそらくその質問に恩恵を与えることでしょう。私はまだこれについて興味があり、それを見ている。 –

+1

* "すべてのドミノノードをクロールしているので、非常に厄介なようです" *。それはどんな場合でもあなたがしなければならないことです。また、 '$( '*')'で一度にすべてのノードを選択してから繰り返し実行することもできますが、いずれの場合もすべてのノードを走査しなければなりません。 –

+0

おそらく、[jQuery XPath plugin](https://github.com/ilinsky/jquery-xpath)のような高度なセレクタが必要です。もしあなたがxpathを使うと決めたら、おそらく[この回答](http://stackoverflow.com/a/2994336/771578)もあなたを助けるでしょう。 –

答えて

8

このスクリプトは、特定のテキストを含むすべてのノードを検索します。また、テキスト(正規表現など)の文字列テストを行うこともできます。 - 高速化のための異なるトップレベル・セレクタを使用http://jsfiddle.net/85qEh/4/

PS:ここ

function getNodesThatContain(text) { 
    var textNodes = $(document).find(":not(iframe, script, style)") 
     .contents().filter( 
      function() { 
      return this.nodeType == 3 
      && this.textContent.indexOf(text) > -1; 
    }); 
    return textNodes.parent(); 
}; 

console.log(getNodesThatContain("test")); 

は、テストのためにフィドルあります。たとえば、#containerの中だけが必要な場合は、var textNodes = $('#container')...

+0

bobinceの解決策よりも読みやすく簡潔です。 +1。ただし、パフォーマンスがどのように比較されるかはわかりませんが、それは重要です。 –

+0

あなたが見せた例でそれをテストしました。http://jsfiddle.net/85qEh/3/ Jqueryのように見えます。 –

+0

ええ、私はちょうど今試し、同じことを見つけた - 私の間違い。また、申し訳ありませんが、私が間違っていたことを知った後で、私のコメントの中で既にポイントを編集しました。あなたには誰にも返信していないようです。ごめんなさい。 :P –

-2

$('div >:contains("text Im searching for")') 
+5

downvoteは私のものではありませんが、これはリンクされた質問で利用可能な "clunky"ソリューションの一部です。 –

+0

さらにもう一つの質問のコメントで説明したように、それはうまくいきません。 -1 –

+0

他人が発見した問題:http://jsfiddle.net/DM4vz/2/これを超える親を追加すると、検索は失敗します。 – RandallB

2

超えるが明らかに高い評価を受けていない解決策として参照されるように他の質問で提供されるソリューションは、これを行うためにあるJSでこれを試してみてくださいそれは、すべてのDOMノードをクロールするために巨大なものを書くよりも、それほどclunkyではなく、実際には狭い範囲に影響を及ぼすはずです。

他の誰かがより良いアイデアを持っているなら、私は間違いなく興味を持っています。

http://jsfiddle.net/TT7dR/42/

+0

それはハッキーで非効率ですが、うまくいくように見えます(そしてそのコメントは、その背後にある論理を明確に説明しています)。暫定的な+1ですが、確かに*短くて清潔な方法がありますか? –

+2

しかし、ここでは他のdivも接しています。 – WooCaSh

+1

JSFiddleは失敗します。私は偶然、悪いマークアップを含んでいた以前のリンクを使用し、質問に直接関係しませんでした。私はそれを更新し、より良い洞察力を提供します。 – RandallB

関連する問題