优雅的遍历DOM之---createTreeWalker

2,264 阅读1分钟

document.createTreeWalker

常规我们获取dom下所有的子元素都是通过遍历的形式, 类似for循环判断nodeType的形式获取到真实的dom

今天发现MDN文档中还有一个api就是 createTreeWalker, 可以获取到元素下所有的子元素

document.createTreeWalker(root[, whatToShow[, filter[, expandEntityReferences]]]);

Attributes

  • root 需要获取的根节点

  • whatToShow 配置项, 可以根据配置是获取所有的元素、属性、等。。。 具体的写法就是NodeFilter

    具体的配置就是NodeFilter

  • filter

    filter是一个对象, 其中acceptNode是一个必传的参数, 值是一个函数,可以通过函数进行业务类型的过滤

    {
        acceptNode: function(Node) {
            // 业务代码
        }
    }
    

可以根据 treeWalker.currentNode 获取当前指针指向的节点

Methods

  • firstChild

获取treeWalker实例的第一个子元素

  • lastChild

获取treeWalker实例的最后一个子元素

  • nextNode

移动currentNode 指针到下一个可见元素

  • nextSibling

获取currentNode的之后的兄弟节点

  • parentNode

获取currentNode的父节点

  • previousNode

获取currentNode的前一个节点

  • previousSibling

获取currentNode的之前的兄弟节点

example code


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>createTreeWalker</title>
</head>

<body>

    <div class="container">
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
        </ul>
    </div>


    <script>

        function log (data) {
            console.log('data :',data)
        }

        var container = document.querySelector(".container")

        var tree = document.createTreeWalker(container, 1)

        let currentNode = tree.currentNode; // 获取当前节点指针

        log(currentNode) // body > div

        tree.nextNode() // 移动指针

        log(tree.firstChild()) // <li>1</li>

        tree.parentNode() // 切换到父节点

        log(tree.lastChild()) // <li>6</li>

        log(tree.previousSibling()) // <li>5</li>
        log(tree.previousNode()) // <li>4</li>
    </script>

</body>

</html>