【问题标题】:Get text of nested childnodes javascript获取嵌套子节点javascript的文本
【发布时间】:2014-05-26 15:23:36
【问题描述】:

虽然我已经阅读了很多关于这个主题的帖子,但我无法得到想要的结果。
我的目标是在纯 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>

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

【问题讨论】:

    标签: javascript dom nodes


    【解决方案1】:

    这是因为您只检查childNodesfind,而不是子节点的子节点,它继续。

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

    你为什么不直接做:document.getElementById('find').textContent;

    【讨论】:

      【解决方案2】:

      如果您不需要逐个节点获取文本,您可以使用 node.textContent 从祖先那里获取所有文本,

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

      否则,您将需要遍历或递归 DOM 树 以查找 nodeType 3 并访问 .data.childNodes 否则,例如递归

      function getText(node) {
          function recursor(n) {
              var i, a = [];
              if (n.nodeType !== 3) {
                  if (n.childNodes)
                       for (i = 0; i < n.childNodes.length; ++i)
                           a = a.concat(recursor(n.childNodes[i]));
              } else
                  a.push(n.data);
              return a;
          }
          return recursor(node);
      }
      // then
      console.log(getText(document.getElementById('find')));
      

      【讨论】:

      • :我知道我可能要求太多了,但是我将如何更改包含 b 文本的标签的文本?无论如何,谢谢你的代码很棒。
      • 不要返回n.data,而是返回n,这样你就可以再次循环测试/操作,或者立即对n执行操作
      • :再次感谢您的想法,我可以这样解决:function GetChildNodes (container) { function recursor(container){ for (var i = 0; i -1){child.nodeValue='some other text' } } } } recursor(container) } var container = document.getElementById ("find"); GetChildNodes(容器)
      【解决方案3】:

      由于我的目的也是在文本等于字符串时更改嵌套元素中的文本,
      感谢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>
      

      再次感谢保罗!

      【讨论】:

        【解决方案4】:

        保罗回答的简短版本

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-18
          • 1970-01-01
          • 1970-01-01
          • 2019-07-23
          • 1970-01-01
          相关资源
          最近更新 更多