美文网首页前端技术程序员工具癖
用面向对象的方法写"敲门砖"

用面向对象的方法写"敲门砖"

作者: zhaoolee | 来源:发表于2018-03-09 15:59 被阅读118次

    一道名为"敲门砖"的面试题:
    用面向对象的方法写,点击列表内,子元素的子标签, 来删除子元素

    敲门砖

    考点:

    • 递归(删除标签, 需要找到列表的直属子标签, 需要通过递归层层往上找, parentNode)
    • 冒泡(只需为顶级父元素addEventListener绑定事件, 并通过e.target区分子标签, 即可实现一次绑定, 多次使用)
    • ES6语法(使用ES6的class 构造方法需要指明constructor函数)
    • 布局(使用网格布局,快速实现内联元素的两端对齐, justify-content: span-between)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>阿里敲门砖</title>
        <style>
            li{
                list-style: none;
                display: flex;
                justify-content: space-between;
                align-items: center;
                background-color: #fdf6e3;
                border: 1px solid #0c8ac5;
                height: 100px;
                padding: 5px;
            
            }
            
            .del{
                border:1px solid #323232;
                color: #c03035;
            }
        </style>
    </head>
    <body>
    
        <ol class="list">
            <li><span class="desc">黄河之水</span><span class="del">X</span></li>
            <li><span class="desc">天上来</span><span class="del">X</span></li>
            <li><span class="desc">奔流</span><span class="del">X</span></li>
            <li><span class="desc">到海</span><span class="del">X</span></li>
            <li><span class="desc">不复回</span><span class="del">X</span></li>
            <li><span class="desc">君不见</span><span class="del">X</span></li>
            <li><span class="desc">高唐明镜</span><span class="del">X</span></li>
            <li><span class="desc">悲白发</span><span class="del">X</span></li>
        </ol>
        
        <ol class="list">
            <li><span class="desc">到海</span><span class="del">X</span></li>
            <li><span class="desc">不复回</span><span class="del">X</span></li>
            <li><span class="desc">天上来</span><span class="del">X</span></li>
            <li><span class="desc">奔流</span><span class="del">X</span></li>
            <li><span class="desc">君不见</span><span class="del">X</span></li>
            <li><span class="desc">黄河之水</span><span class="del">X</span></li>
            <li><span class="desc">高唐明镜</span><span class="del">X</span></li>
            <li><span class="desc">悲白发</span><span class="del">X</span></li>
        </ol>
    
        <script>
            
    
    
            class List{
    
                constructor(els){
                    // 将this转换为局部变量self, 个人爱好Python3,这个写法类似Python3
                    let self = this;
    
                    // 根据类选择器,选择所有符合条件的的清单, 并生成列表
                    let el = Array.from(document.querySelectorAll(els))
                    // 为每个清单绑定事件
                    el.forEach(item => item.addEventListener('click', function(e){
                        // 如果点击的元素的类名带有del, 则可以删除这条标签
                        if (e.target.className.indexOf('del') > -1){
                            // 移除相应的子元素
                            self.removeDom.call(self, item, e.target)
                        }
    
                    }))
                
                }
                removeDom(item, tg){
                    let self = this;
                    // 设置移除判定函数
                    let judgeRemoveDom = function(item, tg){
                        // 获取触发事件元素的父级元素
                        let parentNode = tg.parentNode;
                        // 如果当前找到的元素的父元素恰好为item, 则可以直接移除
                        if (item === parentNode){
                            item.removeChild(tg);
                        }
                        // 如果当前的父元素不是item, 则继续往上找
                        else{
                            tg = parentNode;
                            judgeRemoveDom(item, tg);
                        }
                    }
                    judgeRemoveDom(item, tg);
                }
            }
            window.addEventListener('DOMContentLoaded', function(){
                new List('.list')
            })
    
    
        </script>
    
    </body>
    </html>
    

    相关文章

      网友评论

        本文标题:用面向对象的方法写"敲门砖"

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