1

我做了这个来尝试提取文本。

<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 几次。谁能告诉我为什么这不能正常工作?提前致谢。

4

2 回答 2

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));

此外,您可能想抢占先机textContentnodeValue但这是您的决定。您还可以更细化并测试 if 是否nodeName为 aSCRIPT并忽略 if (如果您选择了),但我会让您做出决定。

跟进:这是一个你可以玩的小提琴,带有<script>测试注释和可选的空格删除:http: //jsfiddle.net/KZuk5/2/

于 2012-12-27T16:19:46.317 回答
2

有不同类型的节点——具体来说,我们正在研究两种,一个文本节点和一个 HTML 节点。文本节点是一个对象,并且有一个名为nodeValue(您正在正确访问)的属性。但是,HTML 节点没有该nodeValue属性(或者更确切地说,它被设置为null)。

要获取 HTML 节点的内部值,请使用.innerHTML.

于 2012-12-27T16:16:22.330 回答