如何在没有孩子的情况下获取元素的文本?
element.textContent
和element.innerText
似乎都无法正常工作。
HTML:
<body>
<h1>Test Heading</h1>
<div>
Awesome video and music. Thumbs way up. Love it. Happy weekend to you and your family. Love, Sasha
</div>
</body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript">
fool("body");
</script>
这是fool
函数:
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
<td class="gensmall">
Last visit was: Sat Mar 31, 2012 10:50 am
<br>
<a href="./search.php?search_id=unanswered">View unanswered posts</a> | <a href="./search.php?search_id=active_topics">View active topics</a>
</td>
如果我使用nodeType
,则只会更改a
元素的文本,而不会更改td
本身(“上次访问....”)
答案 0 :(得分:17)
找到文本节点:
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;
编辑 - 如果你想要后代(“children”)节点中的文本,并且(现在很明显)你正在使用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;
};
等一下,我会测试出来:-)(似乎有用)
答案 1 :(得分:4)
此代码与其他两个答案的结果相同,但是更具表现力,功能性。所有现代浏览器(IE9及更高版本)均支持filter
和map
数组方法。
因为其他答案现在有点过时了,所以把它扔进那里。
var content = Array.prototype.filter.call(element.childNodes, function (element) {
return element.nodeType === Node.TEXT_NODE;
}).map(function (element) {
return element.textContent;
}).join("");
答案 2 :(得分:3)
元素的文本也是一个单独的节点。 考虑一下这段代码:
<span>
Some text
<span>Inner text</span>
More text
<span>More inner text</span>
Even more text
</span>
当你说你想要元素的文字时,你的意思是什么? 只是直接的孩子?
然后这段代码可以提供帮助:
for (var element in elements) {
if (element.nodeType == Node.TEXT_NODE) {
// do something
}
}
答案 3 :(得分:1)
除了像Pointy这样的答案之外,处理<br/>
的换行符也可以这样做:
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;