获取嵌套子节点javascript的文本

时间:2014-04-12 11:58:51

标签: javascript dom nodes

虽然我已经阅读了很多关于这个主题的帖子,但我无法得到理想的结果 我的目标是在纯JavaScript中获取嵌套子节点的文本。 使用此代码

function GetChildNodes () {
    var container = document.getElementById ("find");
    for (var i = 0; i < container.childNodes.length; i++) {
        var child = container.childNodes[i];
        if (child.nodeType == 3) {
           var str=child.nodeValue
           console.log(str)
        }
        else {
            if (child.nodeType == 1) {
                var str=child.childNodes[0].nodeValue
                console.log(str)                        
            }
        }
    }
}

GetChildNodes()

如果html是

,我可以得到文本
<div id="find">
    aaa
    <div>aaa</div>
    <div>aaa</div>
    <div>aaa</div>
    <div>aaa</div>
</div>

但是使用像这样的HTML代码

<div id="find">
    aaa
    <div>aaa<div>bbb</div></div>
    <div>aaa<div>bbb</div></div>
    <div>aaa</div>
    <div>aaa</div>
</div>

......错了。
你能给我一个解决方案吗?

4 个答案:

答案 0 :(得分:3)

如果您不需要逐节点地获取文本,则可以使用node.textContent从<祖先'获取所有文本,

var str = document.getElementById('find').textContent;
console.log(str);

否则,您需要迭代或递归 DOM树,寻找 nodeType 3并访问.data或{ {1}}否则,例如递归

.childNodes

答案 1 :(得分:2)

由于我的目的是在文本等于字符串时更改嵌套元素中的文本,因此感谢Paul S的建议 我可以这样解决我的问题

<script type="text/javascript">
function GetChildNodes (container) {
    function recursor(container){
            for (var i = 0; i < container.childNodes.length; i++) {
                var child = container.childNodes[i];
                if(child.nodeType !== 3&&child.childNodes){
                    recursor(child);
                }else{
                    var str=child.nodeValue;
                    if(str.indexOf('bbb')>-1){child.nodeValue='some other text'};
                    };
             };
    };
    recursor(container);
};
var container = document.getElementById ("find");
GetChildNodes(container);
</script>

再次感谢保罗!

答案 2 :(得分:0)

这是因为您只检查childNodes的{​​{1}},而不检查子节点的子节点,然后继续。

元素可以拥有的子元素数量没有限制,因此每次都应该有一个find循环或递归函数。

你为什么不这样做:for

答案 3 :(得分:0)

保罗回答的简短版本

function getText(node) {
  if (node.nodeType == 3) return node.data; // text node
  if (!node.childNodes) return '';
  let s = '';
  for (let i = 0; i < node.childNodes.length; i++) {
    s += getText(node.childNodes[i]);
  }
  return s;
}