js 给爱的人发个邮件吧

git作业地址

https://suyaru.github.io/Pre/Pre31/work01.html

原题

http://ife.baidu.com/course/detail/id/52

代码:

<html>
    <head>
        <script type="text/javascript" src="jquery/jquery-3.3.1.min.js"></script>
        <link rel="stylesheet" href="work01.css"/>
    </head>
    <body>
        <div class="wrapper">
            <input id="email-input" type="text" >
            <ul id="email-sug-wrapper" class="email-sug"></ul>
        </div>
    </body>
    <script type="text/javascript">
        var emailInput=document.getElementById('email-input');
        var postfixList = ['163.com', 'gmail.com', '126.com', 'qq.com', '263.net'];
        var theUl=document.getElementById('email-sug-wrapper');
        var chooseIndex=0;
        
        // 页面加载时键盘获得焦点
        window.onload=function(){
            emailInput.focus();
        }
        // 键盘输入

        emailInput.onkeyup=function(event){
          //新增  如果按键不是上下及回车重置选中状态()  enter 13 上38 下40 esc 27
            if((event.keyCode==13||event.keyCode==38||event.keyCode==40)&&emailInput.value!=""){
                listenKeyWords();
            }else if(event.keyCode==27){
                emailInput.select();                // esc 内容全选
            }else{
                theUl.innerHTML="";                  // 增加一步,清空之前的所有内容
                var content=getInput();              // 获取用户输入
                var contentList=genarate(content);   // 生成提示框中的提示内容
                addContent(contentList);            //  将提示内容添加到email-sug-wrapper中 
                resetState();
                if(content==""){
                        isHide();
                }else{
                    isShow();
                } 
            }
             
        }
        // 重置选中状态
        function resetState(){  
            var index=Number(findChoosed());
            if(index!=0){       // 当前选中状态Li不是第一个
                theUl.children[index].className="";
                setActive(theUl.children[0]);                       // 设置第一个Li为选中状态
            }
        }
        // 找到选中状态的 li的下标
        function findChoosed(){
            var k=0;
            for(var k in theUl.children){
                if(theUl.children[k].className=="active"){       // 当前选中状态Li不是第一个
                   return k;
                }
            }
            if(k==0){
                return k;
            }
        }

        

        // 生成提示框中的提示内容
        function genarate(content){
            // 对于特殊字符进行转义编码
            content=transimite(content);
            var before="";
            var later;
            if(content.indexOf("@")!=-1){          // 存在@
                before=content.substr(0,content.indexOf("@"));
                later=content.substr(content.indexOf("@")+1,content.length-1);
            }
            if(later==undefined){
                before=content;
            }
            var theList=[];
            var count=0;
            for(var i in postfixList){
                if(postfixList[i].indexOf(later)==0){
                    var p=document.createElement('p');
                    p.innerHTML=before+"@"+postfixList[i];  
                    
                    theList.unshift(p.innerHTML);
                }else{
                    count++;
                }
            }
            if(count==postfixList.length){
                for(var j in postfixList){
                    var p=document.createElement('p');
                    p.innerHTML=before+"@"+postfixList[j];  
                    theList.unshift(p.innerHTML);
                }
            }
            return theList;
        }

        //  将提示内容添加到email-sug-wrapper中
        function addContent(contentList){
            for(var j in contentList){
                var li=document.createElement('li');
                li.innerHTML=contentList[j];
                li.setAttribute('class'," ");
                theUl.appendChild(li);
            }
            setActive(theUl.firstChild);
        }

        // 隐藏提示框
        function isHide(){
            theUl.style.visibility="hidden";
        }

        // 显示提示框
        function isShow(){
            theUl.style.visibility="visible";
        }

        // 监听鼠标点击
        theUl.onclick=function(e){
            e=e||window.event;
            e.target=e.target||e.srcElement;
            if(e.target.nodeName.toLowerCase()=='li'){  // 被点击的是不是提示框中的Li节点
                var choosing=e.target.innerHTML;        // 获取被点击Li对应的提示内容
                emailInput.value=choosing;              // 将内容放到input输入框中  
                isHide();                               // 隐藏输入框
                emailInput.focus();
            }
        }

        // 对于特殊字符进行转义编码
        function transimite(origin){
            var grex="";
            switch(origin){
                case '&':grex=origin.replace(/&/g,"&");break;
                case '<':grex=origin.replace(/</g,"<");break;
                case '>':grex=origin.replace(/>/g,"&rt;");break;
                case '<br>':grex=origin.replace(/<br>/g,"");break;
                case '\'':grex=origin.replace(/\'/g,"'");break;
                case '\"':grex=origin.replace(/\"/g,""");break;
            }
            if(grex==""){
                return origin;
            }else{
                return grex;
            }
            
        }

        // 默认第一个为选中状态
        function setActive(chooseNode){
            // 传入一个当前节点,先删除父节点下所有子节点的class=="active"
            var parent=chooseNode.parentNode;
            var children=parent.children;
            for(var i in children){
                if(children[i].className=="active"){
                    removeClass(children[i]);
                }
            }
            chooseNode.className="active";
        }

        // 移除所有li 的class属性
        function removeClass(removeNode){
            removeNode.className="";
        }

        // 监听特殊3个键的键盘事件  enter 13 上38 下40
        function listenKeyWords(){             
            var index=Number(findChoosed());                // 找到当前为选中状态的Li  清除掉它的选中状态
            theUl.children[index].className="";

            if(event.keyCode==38){                  // 上键
                if(index!=0){
                    setActive(theUl.children[index-1]);
                }else{
                    setActive(theUl.lastChild);
                }
            }
            if(event.keyCode==40){                  // 下键
                if(index!=theUl.children.length-1){
                    setActive(theUl.children[index+1]);
                }else{
                    setActive(theUl.firstChild);
                }
            }
            if(event.keyCode==13){                  // 回车
                emailInput.value=theUl.children[index].innerHTML;
                emailInput.focus();
                isHide();
            }
        }
        // 获取用户输入
        function getInput(){
            var temp=emailInput.value.trim();
            return temp;
        }
    </script>
</html>

踩的坑

1、经常有说子节点或者父节点 undefined,主要原因是容易把 jquery和js 混用,比如 setAttribute 、className等,而往往是Jquery能用,Js 要自己写方法

2、有个坑纠结了一个小时,原来是index 没有强制转换成 Number 数据,所以每次报错都是 子节点undefined

3、代码耦合性还是有点高,有时间再重写一遍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值