在元素中获得文本,不包括死者
我看到,jQuery具有.text()
函数来获取元素及其后代元素中的所有文本。
有没有办法只获得直接在元素内的文本?
例如。
<div> Here is <b>some</b> text. </div>
从那我想得到只是Here is text.
var result = $('div').contents().map(function() { if( this.nodeType === 3 ) { return this.data; } }).get().join('');
例如: http : //jsfiddle.net/PeXue/
这个使用contents()
[docs]方法来获取div
所有子节点,包括文本节点,然后map()
[docs]方法来构build一个只有文本节点的文本内容的集合( this.nodeType === 3
)使用他们的.data
属性。
在完成之后,它使用get()
[docs]方法从集合中创build一个数组,最后使用.join()
[docs]连接结果。
当然你的select器应该是针对你所定位的<div>
。
编辑:如果你想正常化单词之间的空格,你可以使用jQuery.trim()
[docs]方法修剪每个文本节点的内容的前导和尾随空白,然后给.join()
一个单个空间join每个集合。
var result = $('div').contents().map(function() { if( this.nodeType === 3 ) { return $.trim( this.data ); } }).get().join(' '); alert( result );
例如: http : //jsfiddle.net/PeXue/1
我们甚至可以缩短一点,并确保同时排除任何空的文本节点:
var result = $('div').contents().map(function() { return $.trim( this.data ) || null; }).get().join(' '); alert( result );
例如: http : //jsfiddle.net/PeXue/2
编辑2:
通过使用jQuery.map()
[docs]方法,您可以获得巨大的性能提升,这是为了更通用的用途。
var result = $.map( $('div')[0].childNodes, function(val,i) { if (val.nodeType === 3) { return val.data; } }).join('');
这是一个performance差异的性能testing 。
在jsFiddle工作的例子
var divClone = $('div').clone(); // WARNING: divClone.children().remove(); // This code is much slower than the alert(divClone.text()); // code in the selected answer.
更新
@帕特里克dw的答案中的性能testing清楚地表明, 他的方法是更好的select 。 我没有删除这个答案,因为我认为这对未来读者可能不知道哪个方法更好是有帮助的。