背景
DOM节点统计 DOM 的体积过大会影响页面性能,假如你想在用户关闭页面时统计(计算并反馈给服务器) 当前页面中元素节点的数量总和、元素节点的最大嵌套深度以及最大子元素个数, 请用 JS 配合原生 DOM API 实现该需求(不用考虑陈旧浏览器以及在现代浏览器中的兼容性, 可以使用任意浏览器的最新特性;不用考虑 shadow DOM)。
输入输出
{totalElementsCount: 9,maxDOMTreeDepth: 4,maxChildrenCount: 3}const root = {nodeName: 'html',children: [{nodeName: 'head',children: [],}, {nodeName: 'body',children: [{nodeName: 'div',children: [{nodeName: 'span',children: []}]},{nodeName: 'div',children: [{nodeName: 'span',children: []}, {nodeName: 'span',children: []}, {nodeName: 'span',children: []}]}]}]}
方法:递归
// 递归// 递归中止条件是?没有子节点function getStandCount(node){//节点统计 进入方法增加1let totalElementsCount = 0 ;let maxDOMTreeDepth = 0;let maxChildrenCount = 0 ;if(node.nodeName){totalElementsCount++;}if(node.children && node.children.length){// 深度 每访问增加children加一 并累计子元素的深度// 第一次1 递归第二次进入时 假设 没有子节点 得到的深度为0 返回1 正确// 第一次1 递归第二次进入时 假设有子节点 子节点没有子节点 子节点得到的深度为1(简化逻辑 实际子节点只会返回01两种情况) 也需要进行累加maxDOMTreeDepth++maxChildrenCount = node.children.length;for(let i=0,len = node.children.length;i<len;i++){let subNode = node.children[i];const {totalElementsCount:subTotalElmentCount,maxDOMTreeDepth:subMaxDOMTreeDepth,maxChildrenCount:subMaxChildrenCount} = getStandCount(subNode);// 总节点数计算 情况1 没有子节点 得到的计数为1 情况2 含有子节点 含有子节点会进行再次递归 也能得到子节点的累加totalElementsCount+=subTotalElmentCount;maxDOMTreeDepth+= subMaxDOMTreeDepth;// 含有最多子元素 为当前元素与获取递归子元素的对比即可 取较大值maxChildrenCount = maxChildrenCount> subMaxChildrenCount? maxChildrenCount:subMaxChildrenCount}}return {totalElementsCount,maxDOMTreeDepth,maxChildrenCount}}
