私はdivを次のように設定しています:
<div id="test"> <p>Hello</p> <p style="display: none">Goodbye</p> </div>
編集:明確にするために、これは最も簡単な例です。divには、任意の数のn個の深いネストされた子を含めることができます。
$('#test').getText()
'HelloGoodbye'を返します。Firebugでテストする1つのライナーは次のとおりです。jQuery('<div id="test"> <p>Hello</p> <p style="display: none">Goodbye</p> </div>').text()
これは、jQueryが内部で使用するtextContent(IE以外の場合)がテキストの一部として非表示の要素を返すためと思われます。ふむ
display:none'd要素を無視してテキストコンテンツを返す方法はありますか?基本的に、マウスでdivを強調表示し、システムクリップボードにコピーすることで得られるテキストを模倣しようとしています。それは隠されたテキストを無視します。
興味深いことに、選択範囲を作成してそこからテキストを取得すると、display:none要素内のテキストも返されます。
var range = document.body.createTextRange();
range.moveToElementText($('#test')[0]);
range.select();
console.log(range.toString()); // Also logs Hello Goodbye!
したがって、ドキュメントの選択範囲を作成することは、display:none要素に関してマウスで強調表示することと同じことをするようには見えません。この汚れたピクルスの難問を回避するにはどうすればよいですか?
編集:使用.filter(':visible').text
が提案されていますが、このシナリオでは機能しません。返されるテキストは、マウスでの選択から得られるものとまったく同じである必要があります。したがって、たとえば:
$('<div>test1 <p>test2</p>\r\n <b>test3</b> <span style="display:none">none</span></div>').appendTo(document.body).children().filter(':visible').text()
戻り値
"test2test3"
私が実際に欲しい出力は
test1 test2
test3
\ r \ nに由来する改行、空白、その他すべて