我这样做是为了尝试提取文字。
<script type = "text/javascript">
function extractText(node){
var all = "";
for (node=node.firstChild;node;node=node.nextSibling){
alert(node.nodeValue + " = " + node.nodeType);
if (node.nodeType == 3){
all += node.nodeValue
}
}
alert(all);
}
</script>
它位于html文档的头部。 身体看起来像......
<body onload = "extractText(document.body)">
Stuff
<b>text</b>
<script>
var x = 1;
</script>
</body>
问题是alert(all);
只显示“Stuff”,并且它会添加一些我在执行alert(node.nodeValue + " = " + node.nodeType);
时并不真正理解的空值。它说null = 3几次。谁能告诉我为什么这不能正常工作?提前谢谢。
答案 0 :(得分:3)
如果您想要文档中的文本,您可能需要查看递归调用。但是,如果您不关心孩子,请删除以下第一个if (node.hasChildNodes()){}
条件:
function extractText(node){
var txt = '';
// recursive exploration and option to uncomment the check for a <script>
// <script>s will have children as the the actual portion being executed
// is considered a text node (nodeType===3)
if (node.hasChildNodes()/* && node.nodeName !== 'SCRIPT'*/){
for (var c = 0; c < node.childNodes.length; c++){
txt += extractText(node.childNodes[c]);
}
}else if(node.nodeType===3){
txt += node.textContent;
}
return txt;
}
alert(extractText(document.body));
此外,您可能希望抓住textContent
而不是nodeValue
,但这是您的电话。如果nodeName
是SCRIPT
,您也可以更精细地测试并忽略if(如果您这样选择)但我会让您做出决定。
跟进:这是一个你可以玩的小提琴,<script>
测试评论和可选的空白删除:http://jsfiddle.net/KZuk5/2/
答案 1 :(得分:2)
有不同类型的节点 - 特别是我们正在看两个节点,一个文本节点和一个HTML节点。文本节点是一个对象,并具有一个名为nodeValue
的属性(您正在正确访问)。但是,HTML节点没有nodeValue
属性(或者更确切地说,它设置为null
)。
要获取HTML节点的内部值,请使用.innerHTML
。