在javascript中获取没有子元素的元素的文本

如何在没有孩子的情况下获取元素的文本? element.textContentelement.innerText似乎都不起作用。

HTML:

  

Test Heading

Awesome video and music. Thumbs way up. Love it. Happy weekend to you and your family. Love, Sasha
fool("body");

这是foolfunction:

 jQuery.fn.justtext = function(text) { return $(this).clone() .children() .remove() .end() .text(); }; function fool(el) { reverse(el); function reverse(el) { $(el).children().each(function() { if($(this).children().length > 0) { reverse(this); if($(this).justtext() != "") reverseText(this); } else { reverseText(this) } }); } function reverseText(el){ var text = el.textContent; var frag = text.toString().split(/ /); var foo = ""; var punctation_marks = [".",",","?","!"," ",":",";"]; for(i in frag){ if(punctation_marks.indexOf(frag[i]) == -1) foo += actualReverse(frag[i],punctation_marks) + " "; } el.textContent = foo; } function actualReverse(text,punctation_marks) { return (punctation_marks.indexOf(text.split("")[text.split("").length-1]) != -1)?text.split("").slice(0,text.split("").length-1).reverse().join("") + text.split("")[text.split("").length-1] : text.split("").reverse().join(""); } } 

编辑 :使用node.nodeType并没有真正帮助,这就是原因:想象下面的HTML

  Last visit was: Sat Mar 31, 2012 10:50 am 
View unanswered posts | View active topics

如果我使用nodeType ,只有a元素的文本会改变,而不是td本身(“last visit ….”)

只需找到文本节点:

 var element = document.getElementById('whatever'), text = ''; for (var i = 0; i < element.childNodes.length; ++i) if (element.childNodes[i].nodeType === 3) text += element.childNodes[i].textContent; 

编辑 - 如果你想要后代(“子”)节点中的文本,并且(现在很明显)你正在使用jQuery:

 $.fn.allText = function() { var text = ''; this.each(function() { $(this).contents().each(function() { if (this.nodeType == Node.TEXT_NODE) text += this.textContent; else if (this.nodeType == Node.ELEMENT_NODE) text += $(this).allText(); }); }); return text; }; 

坚持下去,我将测试出来:-)(似乎工作)

此代码与其他两个答案实现了相同的结果,但是以更具表现力和function性的方式实现。 所有现代浏览器(IE9及更高版本)都支持filtermap数组方法。

因为其他答案现在有点过时了,所以把它扔在那里。

 var content = Array.prototype.filter.call(element.childNodes, function (element) { return element.nodeType === Node.TEXT_NODE; }).map(function (element) { return element.textContent; }).join(""); 

元素的文本也是一个单独的节点。 考虑这段代码:

  Some text Inner text More text More inner text Even more text  

当你说你想要元素的文本时,你的意思是什么? 只是直接的孩子?

然后这段代码可能会有所帮助:

 for (var element in elements) { if (element.nodeType == Node.TEXT_NODE) { // do something } } 

除了像Pointy这样的答案之外,处理换行字符可以这样做:

 txt = ''; for (var i = 0; i < element.childNodes.length; ++i) if (element.childNodes[i].nodeType == 3) { txt += element.childNodes[i].textContent; } else if (element.childNodes[i].nodeType == 1) { name = element.childNodes[i].nodeName || element.childNodes[i].tagName || ''; if (name.toUpperCase() == 'BR') { txt += '\n'; } } return txt;