を返します。
など。
第一試合:<リチウム> <のhref = "#" >のjQuery </> < /李>
第二試合:<のhref = "#" >のjQuery </>
どのようにすることができます私は選択から親ノードを持つすべての要素を削除し、実際に定義された内部テキストを含む要素だけを残しますか?あなたはこのコードだけで、その要素のテキストノードを反復処理して、比較を行いますjquery.comフィルタは、()私はいくつかの内部テキストに一致するページ上のすべての要素を見つける必要があり、空の親ノード
答えて
に上記のスクリプトを実行しようとすることができ、テストのために
。
$("body *:visible").filter(function() {
var childNodes = this.childNodes,
text = '';
$.each(childNodes, function(i, node) {
if (node.nodeType != 3) {
return true;
}
text += node.data;
});
return text == 'jQuery';
});
また、大文字と小文字を区別しない検索を行う場合は、一致する文字列の小文字のバージョンと比較する前に、テキストノードでtoLowerCase()
を使用してください。
firstChildノードのタイプだけを比較しているので、このロジックが「
@AdamTerlson:私のコードの初期バージョンを見ているような感じです:) – alex
私は本当にありました。良い編集。しかし、nodeTypeの型がtextではない場合、真ではなく 'return false'を使うべきでしょうか? –
.text()
の値を比較しているため、ロジックが異常終了しています。これにより、子ノードのマークアップを含む、すべてのHTMLマークアップが取り除かれます。あなたは子要素を含めないと、そのテキストに一致する要素をしたい場合は、単純に変更します。
$("body *:visible").filter(function(){ return $(this).html().toLowerCase() == 'jquery' });
は今、言われたこと、これは私はむしろ遅い疑うだろうかなり悪フィルタです。
ありがとうございます。質問は終了することができます。 – Slava
これは、text()が要素の内部テキストを返します。その要素にはすべての子孫の内部テキストが含まれているからです。
あなたは直接の子要素とテキストノードを一致させるだけするためにcontents()を使用する必要があります:
$("body *:visible").filter(function() {
var textNodes = $(this).contents().filter(function() {
return this.nodeType == 3;
});
return (textNodes.length > 0 && textNodes[0].nodeValue == "jQuery");
});
これはうまく見えますが、最初のテキストノードと比較するだけではありませんか? – alex
@alex、実際には、最初のテキストノードを確認するだけで済みます。それは質問者が* full * inner textが 'jQuery'に等しい要素にマッチさせたいからです。この状況では、空白テキストノードは存在せず、その値は単一のテキストノードに格納されます。 –
フレデリック、ありがとう。あなたのソリューションは完全に機能しますが、要素を見つけるのに約1〜2秒かかりました。このアプローチのパフォーマンスを改善する機会はありますか(私はSelenium 2(WebDriver)プロジェクトに含める必要があり、テストのパフォーマンスは私にとって非常に重要です)? – Slava
ではなく、いくつかの未知の理由でjQueryのページへのリンク、というjsfiddle.netでテストを作成しますあなたの問題を示しています。また、比較では大文字と小文字が区別されるため、サンプルケースは正確ではありません。 –