有没有一种方法可以使用jQuery在dom遍历中打印结束元素?

时间:2019-03-26 01:02:27

标签: javascript jquery html dom traversal

我正在尝试学习jQuery以获得的新工作机会,发现自己对它提供的不同遍历命令有些困惑。

我想按顺序打印每个元素的名称标签,其深度和其结束标签,并且想知道是否有办法做到这一点。

我让它适用于降序元素和没有子元素的元素,但是我无法获得元素的升序结束标记。

这是html

<html id = "test">
<head>
</head>
<body>
    <p> Hello World</p> 
    <div id = "div1"></div>
</body>
</html>

这是我的jQuery脚本

$(document).ready(function() {

    domWalk();

    function domWalk() {
        $("html").find("*").addBack().each(function() {
            console.log( $(this).parents().length +" <"+ this.nodeName + "> ");
            if($(this).children() .length == 0){
                console.log( $(this).parents().length +" </"+ this.nodeName + "> ");
            }

        });
    };

});

预期结果

0<HTML>
1<HEAD>
1</HEAD>
1<BODY>
2<P>
2</P>
2<DIV>
2</DIV>
2<SCRIPT>
2</SCRIPT>
1</BODY>
0</HTML>

实际结果

0<HTML>
1<HEAD>
1</HEAD>
1<BODY>
2<P>
2</P>
2<DIV>
2</DIV>
2<SCRIPT>
2</SCRIPT>

2 个答案:

答案 0 :(得分:0)

  

但是我无法获得元素的升序结束标记

没有“结束标记”之类的东西,只有“元素”-从HTML转换为DOM后,它与父母/子女/兄弟姐妹一起存在于DOM的层次结构中-更像树状视图比HTML。

如果您想知道何时结束,或者可以使用$(this).index() == $(this).siblings().length-1jQuery: how do I check if an element is the last sibling?)之类的支票,可以递归地编写函数

答案 1 :(得分:0)

jQuery不会自动为您提供这样做的方式,JavaScript会为您提供。您只需要构建一个在带有子节点的节点上进行迭代的递归函数,如下所示:

function getTree($node, level) {
  level = level || 0;
  return $node.toArray().reduce(function(array, item) {
    var $item = $(item);
    var $children = $item.children();
    array.push(level + '<' + item.nodeName + '>');
    if ($children.length) {
      Array.prototype.push.apply(array, getTree($children, level + 1));
    }
    array.push(level + '</' + item.nodeName + '>');
    return array;
  }, []);

}

console.log(getTree($('html')));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html id="test">

<head>
</head>

<body>
  <p> Hello World</p>
  <div id="div1"></div>
</body>

</html>

您将看到,在上一片段中,它将使用在幕后创建的script标签和style标签,但是我认为结果就是您要搜索的内容。 / p>

这与使用常规JavaScript(ES6)的功能相同:

const getTree = (node, level = 0) =>
  Array.prototype.reduce.call(node, (array, item) => {
    array = [...array, `${level}<${item.nodeName}>`];
    (item.children.length && (array = [...array, ...(getTree(item.children, level + 1))]));
    array = [...array, `${level}</${item.nodeName}>`];
    return array;
  }, []);

console.log(getTree(document.querySelectorAll('html')));
<html id="test">

<head>
</head>

<body>
  <p> Hello World</p>
  <div id="div1"></div>
</body>

</html>