#31 DOM标签统计


  • 0
    administrators

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

    例如,如果页面中:

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

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


  • 0

    @胡子大哈 这道题主要想考察哪个知识点?


  • 0
    administrators

    @webeautiful DOM、数组操作、Set ,靠什么主要看怎么答了。


  • 2

    跟大哈想到一块去了

    const getPageTags = () => {
      var doms = document.getElementsByTagName('*')
      var s = new Set([].slice.call(doms).map(dom => dom.tagName));
      return Array.from(s);
    }

  • 0
    管理员

    简化

    const getPageTags = () => {
      let doms = document.getElementsByTagName('*')
      return [...new Set([...doms].map(dom => dom.tagName))];
    }
    

  • 0

    const getPageTags = () => [...new Set([...document.all].map(d => d.tagName.toLowerCase()))]

  • 0

    @yyssjj33 请问[].slice.call(doms)这一步是什么意思啊


  • 0

    @怪兽先森 类数组转换成数组


  • 1

    const getPageTags = ()=>[...new Set(Array.from(document.all,o=>o.localName))];

  • 0

    //递归
    const getPageTags = ()=>{
    let rs=[];
    const forGet=(el)=>{
    for(var i=0,len=el.children.length;i<len;i++){
    let tagName= el.children[i].tagName.toLowerCase();
    if(rs.indexOf(tagName)==-1){rs.push(tagName)}
    if(el.children[i].children.length>0){
    forGet(el.children[i]);
    }
    }
    }
    forGet(document);
    return rs;
    }


  • 0

    const getPageTags = ( )=>{
    return Array.from(new Set(Array.from(document.getElementsByTagName('*')))).map(item=> item.nodeName)
    }

    这个有什么错的嘛? 为啥是wrong answer 自测没什么问题


  • 0

    ES5写法

    var getPageTags = function () {
        var doms = document.getElementsByTagName('*')
        var arr = []
        Array.prototype.forEach.call(doms, function (o) {
            if (!~arr.indexOf(o.tagName)) {
                arr.push(o.tagName)
            }
        })
        return arr
    }
    

  • 0

    我的方法是:BFS+node访问,最后要set去重这一点我本来确实没想到
    练习了一下原生API,这个题还不错。

    const getPageTags = () => {
                var root = document.documentElement;
                var childNodes = root.children; //not childNodes
                var quene = [];
                quene.push(root);
                var result = [];
                while (quene.length !== 0) {
                    var node = quene.shift();
                    result.push(node.nodeName.toLowerCase());
                    var childs = node.children;
                    quene.push(...childs);
                }
                result = [...new Set(result)]
                return result;
            }
    

  • 0

    const getPageTags = () => {
      let arr = []
      Array.from(document.getElementsByTagName('*')).forEach(function(item) {
        arr.push(item.tagName.toLowerCase())
      })
      return [...new Set(arr)]
    
    }
    
    

  • 0

    /**
     * 思路: 重点是document.querySelectorAll('*')获取所有元素。然后取tagName,去重
     */
    
    const getPageTags = () => [...new Set(Array.prototype.map.call(document.querySelectorAll('*'), node => node.tagName.toLowerCase()))]
    
    
    

登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待