热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DOM树遍历之JS完成DFS&BFS

我们平常能够采纳DFS(深度优先遍历)和BFS(广度优先遍历)来遍历DOM树引见DFS&BFS我们来连系详细例子举行剖析,给出HTML代码片断以下:

我们平常能够采纳DFS(深度优先遍历)BFS(广度优先遍历)来遍历DOM树

引见 DFS & BFS

我们来连系详细例子举行剖析,给出HTML代码片断以下:









DFS老是先进入下一级节点,只要当下一级没有未遍历的子节点时才会进入到当前层级的别的节点。关于上面例子DFS遍历效果应为:

root, container, sidebar, menu, main, post, copyright

BFS则老是先遍历当前层级的一切节点,只要当当前层级一切节点都遍历完毕后才会进入下一层级。关于上面例子BFS遍历效果应为:

root, container, sidebar, main, menu, post, copyright

DFS的详细完成

DFS重要采纳递归完成,顺次遍历节点,假如遍历到的节点有子节点,则最先遍历子节点

const DFSTraverse = (rootNodes, rootLayer) => {
const roots = Array.from(rootNodes)
while (roots.length) {
const root = roots.shift()
printInfo(root, rootLayer)
// 假如有子节点,直接遍历子节点,同时将层级加1
if (root.children.length) {
DFSTraverse(root.children, rootLayer + 1)
}
}
}

BFS的详细完成

BFS采纳行列的头脑,采纳出队的体式格局遍历节点,假如遍历到的节点有子节点,则将子节点入队(这里处置惩罚节点层级的体式格局比DFS更庞杂一些,由于这里将一切节点都放到了同一个数组中举行处置惩罚)

const BFSTraverse = (rootNodes, rootLayer) => {
const roots = Array.from(rootNodes)
const rootsLayer = [] // 单用一个数组寄存每一个节点的的层级
// 初始化
for (let i = 0; i rootsLayer.push(rootLayer)
}
var rootIdx = 0 // 纪录当前处置惩罚roots中的第几个节点,轻易查找rootsLayer中对应的层级
while (roots.length) {
const root = roots.shift() // 出队
printInfo(root, rootsLayer[rootIdx])
// 假如有子节点,将子节点放到roots行列中
if (root.children.length) {
Array.prototype.push.apply(roots, Array.from(root.children))
// 将当前层级加1获得子节点的层级
rootLayer = rootsLayer[rootIdx] + 1
for (let i = 0; i rootsLayer.push(rootLayer)
}
}
// 处置惩罚下一个root节点
rootIdx++
}
}

效果

先给人人补全代码:

// 输入节点信息
const printInfo = (node, layer) => {
var str = ''
for (let i = 1; i str += ' '
}
console.log(`${layer}:${str}${node.tagName} .${node.className}`);
}
console.log('DFS *******************************');
DFSTraverse(document.querySelectorAll('.root'), 1);
console.log('BFS *******************************');
BFSTraverse(document.querySelectorAll('.root'), 1);

上面例子的运转效果为:
《DOM树遍历之JS完成DFS&BFS》

参考

破解前端口试(80% 应聘者不及格系列):从 DOM 提及
Javascript-ONLY DOM Tree Traversal – DFS and BFS?


推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
狂风
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有