前端练习20 DOM标签统计

知识点

  1. 使用document.documentElement获取页面的<HTML>标签
  2. DOM节点的children属性是一个类数组对象,转换为数组的方法
  3. 数组去重
  4. 递归

题目

完成getPageTags函数,判断你的代码所执行的页面用到了哪些标签。

例如,如果页面中:

<html>
  <head></head>
  <body></body>
  <script>...</script>
</html>

那么getPageTags()则返回数组['html', 'head' 'body', 'script'](顺序不重要)。

实现

首先,要获得当前元素的根元素,也就是html,可以通过querySelector实现,也可以通过document.documentElement获得

然后我首先想到的是,利用了一个中间数组变量result,在每次递归时调传递,最后对数组去重即可

const getPageTags = (node = document.documentElement, result = []) => {
  if (node && node.tagName) {
    result.push(node.tagName)
  }
  if (node.children && node.children.length > 0) {
    [...node.children].forEach(v => getPageTags(v, result))
  }
  return [...new Set(result)]
};

其实不用传递参数,改用闭包也是可以实现的

另一种方法

能不能不用传递参数,直接通过递归调用实现呢?肯定是可以的,首先就要找到递归的公式:

[当前的tagName].concat(...[子元素的tagName])

那么就可以实现了:

const getPageTags = (node = document.documentElement) => {
  if (node.children && node.children.length > 0) {
    // 递归找到子元素的标签
    const childrenNode = [...node.children].map(v => getPageTags(v));
    // 和当前元素的标签结合
    const result = [node.tagName].concat(...childrenNode);
    // 去重
    return [...new Set(result)]
  }
  // 最基本的节点,返回标签
  return node.tagName || ''
};

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值