在元素中获得文本,不包括死者

我看到,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 。 我没有删除这个答案,因为我认为这对未来读者可能不知道哪个方法更好是有帮助的。