使用.text()仅检索未嵌套在子标记中的文本

Meg*_*att 363 tags jquery text

如果我有这样的HTML:

<li id="listItem">
    This is some text
    <span id="firstSpan">First span text</span>
    <span id="secondSpan">Second span text</span>
</li>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用.text()只检索字符串"这是一些文本",但如果我要说$('#list-item').text(),我得到"这是一些textFirst span text secondSecond span text".

有没有办法获得(并可能通过类似的东西.text(""))只是标签内的自由文本,而不是其子标签中的文本?

HTML不是我写的,所以这就是我必须要处理的.我知道在编写html时将文本包装在标签中会很简单,但同样,html是预编写的.

Dot*_*ala 495

我喜欢这个基于此处clone()找到的方法的可重用实现,只获取父元素内的文本.

提供的代码便于参考:

$("#foo")
    .clone()    //clone the element
    .children() //select all the children
    .remove()   //remove all the children
    .end()  //again go back to selected element
    .text();
Run Code Online (Sandbox Code Playgroud)

  • 这是一种非常低效的方法 (60认同)
  • @billyonecan,你能建议一种更有效的方法吗?这很有吸引力,因为它"干净"和"短".你有什么建议? (5认同)
  • 使用此解决方案,您只能获得没有子项的文本,但不能仅替换文本. (4认同)
  • @derekmx271看看[Stuart的答案](http://stackoverflow.com/questions/3442394/jquery-using-text-to-retrieve-only-text-not-nested-in-child-tags/8851526#answer -3442757) (2认同)

mac*_*Jun 347

简单回答:

$("#listItem").contents().filter(function(){ 
  return this.nodeType == 3; 
})[0].nodeValue = "The text you want to replace with" 
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么有效的答案(不产生无关的数据结构)不会像看起来不那么可怕的答案那样被投票.+5如果可以的话. (35认同)
  • 简单和__efficient__答案 (14认同)
  • 更清楚一点,如果你使用IE8 +,你可以使用`this.nodeType == Node.TEXT_NODE`而不是`this.nodeType == 3`.更容易阅读和理解IMO. (14认同)
  • 这不仅更有效,而且更正确!此解决方案适用于文本分散在子元素之间的情况.+5 (9认同)
  • 如果你在没有文字的东西上使用它,这将会破坏.如果你将它作为一个函数使用并且有一个你可能有或没有文本的场景,只需将`.contents().filter(...)`调用捕获到一个局部变量并检查它的长度,例如, `var text = $(this).contents().filter(...); if(text.length){return text [0] .nodeValue; } return"";` (8认同)

rg8*_*g88 141

这似乎是一个过度使用jquery的情况.以下将抓取忽略其他节点的文本:

document.getElementById("listItem").childNodes[0];
Run Code Online (Sandbox Code Playgroud)

你需要修剪它,但它可以在一条简单的线条中获得你想要的东西.

编辑

以上将获取文本节点.要获取实际文本,请使用以下命令:

document.getElementById("listItem").childNodes[0].nodeValue;
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案,你不应该为这个或10个jQuery调用链接一个插件.`$( '富')[0] .childNodes [0] .nodeValue.trim()` (29认同)
  • 这仅适用于<div id ="listItem">您希望<span>其他</ span> </ div>的文本.它不适用于你想要的<div id ="listItem"> <span>其他</ span>文本</ div> (9认同)
  • 如果文本内容被分成几个节点(如crlf,text,crlf的序列)怎么办?有没有(rael-life)保证由ua构建的dom将使用最简单的结构? (5认同)
  • 完全是最好的答案...为什么其他人有时会过度使用jQuery? (5认同)
  • 这仅在文本是第一个子节点时有效 (4认同)

小智 62

更轻松,更快捷:

$("#listItem").contents().get(0).nodeValue
Run Code Online (Sandbox Code Playgroud)

  • 为什么是“get(0)”而不是“[0]”? (2认同)
  • `&lt;div id="listItem"&gt; &lt;div&gt;Contents?&lt;/div&gt; Text 失败?什么文字?&lt;/div&gt;` (2认同)

DUz*_*zun 27

与接受的答案类似,但没有克隆:

$("#foo").contents().not($("#foo").children()).text();
Run Code Online (Sandbox Code Playgroud)

这是一个用于此目的的jQuery插件:

$.fn.immediateText = function() {
    return this.contents().not(this.children()).text();
};
Run Code Online (Sandbox Code Playgroud)

以下是如何使用此插件:

$("#foo").immediateText(); // get the text without children
Run Code Online (Sandbox Code Playgroud)

  • @AndroidDev您可以随时用适合您的选择器替换选择器.这只是为了说明这种技术!我还添加了一个插件版本,以显示即使没有ID它也能正常工作 (3认同)
  • 不是真的,@Oskar。`.contents()` 部分在这里至关重要! (2认同)

小智 8

试试这个:

$('#listItem').not($('#listItem').children()).text()
Run Code Online (Sandbox Code Playgroud)


Bre*_*ent 7

不是代码:

var text  =  $('#listItem').clone().children().remove().end().text();
Run Code Online (Sandbox Code Playgroud)

只是为了jQuery而成为jQuery的缘故?当简单的操作涉及许多链式命令和那么多(不必要的)处理时,也许是时候编写一个jQuery扩展:

(function ($) {
    function elementText(el, separator) {
        var textContents = [];
        for(var chld = el.firstChild; chld; chld = chld.nextSibling) {
            if (chld.nodeType == 3) { 
                textContents.push(chld.nodeValue);
            }
        }
        return textContents.join(separator);
    }
    $.fn.textNotChild = function(elementSeparator, nodeSeparator) {
    if (arguments.length<2){nodeSeparator="";}
    if (arguments.length<1){elementSeparator="";}
        return $.map(this, function(el){
            return elementText(el,nodeSeparator);
        }).join(elementSeparator);
    }
} (jQuery));
Run Code Online (Sandbox Code Playgroud)

致电:

var text = $('#listItem').textNotChild();
Run Code Online (Sandbox Code Playgroud)

参数是在遇到不同的场景时,例如

<li>some text<a>more text</a>again more</li>
<li>second text<a>more text</a>again more</li>

var text = $("li").textNotChild(".....","<break>");
Run Code Online (Sandbox Code Playgroud)

文字有价值:

some text<break>again more.....second text<break>again more
Run Code Online (Sandbox Code Playgroud)


小智 6

它需要根据需要量身定制,这取决于您所呈现的结构.对于您提供的示例,这有效:

$(document).ready(function(){
     var $tmp = $('#listItem').children().remove();
     $('#listItem').text('').append($tmp);
});
Run Code Online (Sandbox Code Playgroud)

演示:http://jquery.nodnod.net/cases/2385/run

但它完全依赖于标记与您发布的内容类似.

  • 未来的读者要注意:这个答案中的代码会杀死实际元素中的孩子.如果这不是预期的效果,那么应该在这里使用`clone`方法. (2认同)

ina*_*ilo 5

index如果文本节点的位置在其同级节点中是固定的,则可以使用

$('parentselector').contents().eq(index).text()
Run Code Online (Sandbox Code Playgroud)