头条前端笔试最后一道题

Posted

    tags:

    篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了头条前端笔试最后一道题相关的知识,希望对你有一定的参考价值。

    题目:
    技术分享图片

    题目来源:链接

    思路:

    1. 用时间委托机制优化DOM绑定事件,不用为每个新增的li绑定事件。
    2. 注意DOM上删除节点后,也要在数据中同步删除。
    3. 模糊匹配用正则对象和字符串的match方法。
    4. onkeyup 属性在用户(在键盘上)释放按键时触发,相对于 onkeyup 事件的事件次序: onkeydown onkeypress onkeyup , onkey是键盘接受字符后的事件,这点和onkeypress不同。
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>头条前端最后一道题</title>
        <style>
            .main-header {
                text-align: center;
            }
    
            h1 {
                font-size: 100px;
                color: rgba(175, 47, 47, 0.4);
                font-weight: 100;
                margin: 20px;
            }
            .real-app {
                width:600px;
                margin: 0 auto;
                box-shadow: 0 0 5px #666;
            }
            .add-input {
                position: relative;
                margin: 0;
                width: 100%;
                font-size: 24px;
                font-family: inherit;
                font-weight: inherit;
                line-height: 1.4em;
                border: 0;
                outline: none;
                color: inherit;
                padding: 6px;
                border: 1px solid #999;
                box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
                box-sizing: border-box;
                font-smoothing: antialiased;
                padding: 16px 16px 16px 60px;
                border: none;
                box-shadow: inset 0 -2px 1px rgba(0, 0, 0, 0.03);
            }
    
         li {
                margin: 4px 0;
                color: rgba(175, 47, 47, 0.8);
                list-style: none;
                padding-left: 18px;
            }
            .close{
                width: 20px;
                height: 20px;
                float:right;
                background: rgba(0,0,0,0.2);
                text-align: center;
                line-height: 20px;
                position: relative;
                bottom: 3px;
                right:4px;
            }
        </style>
    </head>
    
    <body>
        <div class="main-header">
            <h1>todos</h1>
        </div>
        <div class="real-app">
            <input type="text" class="add-input" placeholder="请在这里输入">
            <ul id="parent">
    
            </ul>
        </div>
    
    
    </body>
    <script>
            var arr = [];
            var button = "<div class='close'>X</div>";
            // var button = " X";
            
            var input = document.getElementsByClassName("add-input")[0];
            var left = input.offsetLeft;
            document.getElementById("parent").addEventListener("click",function(e) {
                // e.target是被点击的元素!,this是在父元素捕获的ul
                // 如果被点击的是li元素
                // console.log("success");
                if(e.target && e.target.nodeName == "DIV") {
                    // console.log(this);
                    // console.log(e.target);
                    // console.log(e.target.parentNode)
                    var str = e.target.parentNode.innerHTML.toString();
                    var k = str.indexOf("<");
                    str = str.substr(0,k);
                    // console.log(str);
                    e.target.parentNode.parentNode.removeChild(e.target.parentNode);
                    arr.pop(str);
                    
                    // arr.pop(e.target.parentNode.text)
                }
            });
            //onkeyup 属性在用户(在键盘上)释放按键时触发。
       /*      提示:相对于 onkeyup 事件的事件次序:
                onkeydown onkeypress onkeyup  
                onkey是键盘接受字符后的事件,这点和onkeypress不同
       */       
            input.onkeyup = function(e) {
               var value = this.value;
               console.log(value);
               var ul = document.getElementsByTagName('ul')[0];
               ul.style.left = left + "px";
               ul.style.border = "none";
               ul.innerHTML = "";
               if(value) {
                   var reg = new RegExp(value);
                   for(var i = 0; i <arr.length; i++ ) {
                       //string类型的match方法
                       if(arr[i].match(reg)) {
                           var li = document.createElement('li');
                           li.innerHTML = arr[i] + button;
                           ul.style.border = "1px solid black";
                           ul.appendChild(li);
                       }
                   }
                   
                   e = e || window.event;
                   if(e.keyCode == 13) {
                       var newLi = document.createElement('li');
                       var newValue = value;
                       newLi.innerHTML = newValue + button;
                       ul.appendChild(newLi);
                       arr.push(newValue);
                       input.value = "";
                   }
               }
            //    按照这个方法给每个li添加事件太浪费了,每次新增加回车就要操作一遍,可以利用时间委托机制,即上面的
            //    var close = document.getElementsByClassName("close");
            //    for(var i = 0; i < close.length; i++) {
            //        (function(i){    
            //            close[i].onlick = function(){
            //                this.parentNode.parentNode.removeChild(this.parentNode);
            //            }
            //        })(i);
            //    }
            }
    </script>
    </html>

    以上是关于头条前端笔试最后一道题的主要内容,如果未能解决你的问题,请参考以下文章

    今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径

    58集团2017校招笔试-前端岗

    去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码

    8.22 今日头条笔试

    一道别人分享的阿里面试题

    2022前端笔试面试题