Jquery 获取元素内的文本(不包括Decentant)

Jquery 获取元素内的文本(不包括Decentant),jquery,Jquery,我看到jQuery具有.text()函数,用于获取元素及其子元素中的所有文本 有没有办法只获取直接位于元素中的文本 例如 这里有一些文字。 从中我只想得到这里是文本。 var result = $('div').contents().map(function() { if( this.nodeType === 3 ) { return this.data; } }).get().join(''); 示例: 这将使用该方法获取div的所有子级,包括文本节点,然

我看到jQuery具有
.text()
函数,用于获取元素及其子元素中的所有文本

有没有办法只获取直接位于元素中的文本

例如


这里有一些文字。
从中我只想得到
这里是文本。

var result = $('div').contents().map(function() {
    if( this.nodeType === 3 ) {
        return this.data;
    }
}).get().join('');
示例:

这将使用该方法获取
div
的所有子级,包括文本节点,然后使用其
.data
属性仅构建文本节点(
This.nodeType==3
)的文本内容集合

完成后,它使用方法从集合中生成一个数组,最后使用方法连接结果

当然,您的选择器应该特定于您的目标


编辑:如果您想稍微规范化单词之间的空格,可以使用该方法从每个文本节点的内容中修剪前导和尾随空格,然后给
.join()
一个空格来连接每个集合

var result = $('div').contents().map(function() {
    if( this.nodeType === 3 ) {
        return $.trim( this.data );
    }
}).get().join(' ');

alert( result );
示例:

我们甚至可以将其缩短一点,并确保同时排除任何空文本节点:

var result = $('div').contents().map(function() {
    return $.trim( this.data ) || null;
}).get().join(' ');

alert( result );
示例:


编辑2:

通过使用该方法,您可以获得巨大的性能提升,这意味着更通用的使用

var result = $.map( $('div')[0].childNodes, function(val,i) {
  if (val.nodeType === 3) {
    return val.data;
  }
}).join('');

显示差异。

var divClone = $('div').clone();    //  WARNING:
divClone.children().remove();       //  This code is much slower than the 
alert(divClone.text());             //  code in the selected answer.
更新
@patrick dw答案中的性能测试清楚地表明,他的方法是更好的选择。我没有删除这个答案,因为我认为它对未来可能不知道哪种方法更好的读者很有帮助。

16秒后你的答案。。该死~LOL@Liangliang:必须快点;o) @patrick dw,你为什么要这么做?由于引入了不必要的字符串解析问题,这似乎过于复杂了。性能是否比DOM方法更好?@smartcaveman:我个人认为这比克隆DOM元素、遍历其子元素并销毁子元素更简单。还留出空间来稍微整理一下间距。如果我猜的话,我会说它也更快,但只有性能测试才能确定。@smartcaveman:哇,Chrome13有很大的不同。
var divClone = $('div').clone();    //  WARNING:
divClone.children().remove();       //  This code is much slower than the 
alert(divClone.text());             //  code in the selected answer.