美文网首页
算法:遍历Dom

算法:遍历Dom

作者: 达文西_Huong | 来源:发表于2020-11-08 10:40 被阅读0次

从遍历Dom树,初识算法

参考文章:https://juejin.im/post/6844903731973062669


目的:自定义一个方法去检查DOM中的某个元素

    // HTML结构如下
    <div class="wrapper">
        <section class="header">
            <div class="logo"></div>
        </section>
        <section class="main">
            <div class="sidebar">
                <ul class="menu">
                    <li class='li'>
                        <a href="" id='demo'>li1-a</a>
                    </li>
                    <li class='li'>
                        <a href="">li2</a>
                    </li>
                </ul>
            </div>
        </section>
        <section class="footer">
            <div class="copyright"></div>
        </section>
    </div>

思路和方案:

  1. 深度遍历,利用递归实现
  2. 使用栈,深度优先
  3. 广度优先,非递归实现
深度遍历,利用递归实现
    const cusGetElementByIdByDFS = function(parentNode, id) {
        if(parentNode){
            let target = null
            const children = Array.from(parentNode.children)
            if(parentNode.id === id) {
                return parentNode
            }
            for(let i =0; i < children.length; i++){
                target = cusGetElementByIdByDFS(children[i], id)
                if(target) {
                    return target
                }
            }
        }
        return null
    }
使用栈,深度优先
    const cusGetElementByIdByDFS2 = function(parentNode, id) {
        if(!parentNode) {
            return null
        }
        let stack = []
        if(parentNode.id === id) {
            return parentNode
        }
        parentNode.forEach(item =>{
            stack.push(item)
        })
        while(stack.length > 0) {
            let node = stack.pop()
            if(node.id === id){
                return node
            } else {
                if(node.children.length > 0) {
                    stack = Array.from(node.children).concat(stack)
                }
            }
        }
    }
广度优先,非递归实现
    const cusGetElementByIdByDFS2 = function(parentNode, id) {
        
        const layer = [] 
        
        if ( parentNode ) {
            layer.push({
                node:parentNode,
                dep:1
            })

            while( layer.length > 0 ){
                let root = layer.shift()    // 出队列
                if(root.id === id) {
                    return root
                } else {
                    if(root.children.length > 0) {
                        Array.from(root.children).forEach(node=>{
                             layer.push({
                                node,
                                dep: item.dep++
                            })
                        })
                       
                    }
                }
            }    
        }

        return null
    }

相关文章

  • 算法:遍历Dom

    从遍历Dom树,初识算法 参考文章:https://juejin.im/post/6844903731973062...

  • jQuery 遍历DOM元素的总结

    向上遍历的DOM树(祖先) parent() parents() parentsUntil() 向下遍历DOM树(...

  • DOM遍历-NodeIterator VS TreeWalker

    DOM遍历是以深度优先遍历的,定义了两种遍历DOM的结构类型NodeIterator和 TreeWalker 深度...

  • 遍历

    向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树:parent()parents...

  • 前端面试题总结(算法)

    javascript递归遍历所有DOM文档节点 javascript递归遍历所有DOM文档节点 HTTP 方法:G...

  • JQuery遍历

    向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() 返回被选元...

  • JS高程:读书摘要(十)DOM2级和DOM3级 - [part2

    一、遍历 “DOM2 级遍历和范围”模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator和...

  • diff算法

    什么是diff算法 diff算法是比较新老两个虚拟dom树的的方法,使用它比直接遍历比较两棵树更加高效 目的:为了...

  • JAVA Web学习(5)___第3章 JavaScript脚本

    3.7 DOM技术 3.7.1 DOM的分层结构 3.7.2 遍历文档 Node对象的属性 示例代码(遍历获取全部...

  • 2019-01-09

    遍历 "DOM2级遍历和范围"模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator和Tre...

网友评论

      本文标题:算法:遍历Dom

      本文链接:https://www.haomeiwen.com/subject/qpacbktx.html