zoukankan      html  css  js  c++  java
  • 原生JS模拟百度搜索框

    近期有个新入行的小伙伴一直在问一些基础知识,突然觉得人的记忆力有限,有些平常很少用到的知识点虽简单却也其实很容易模糊,或者是一个单词,或者是一个语法。所以想着应该利用一下工作之余的碎片时间,记录一些工作上的问题和一些有趣的小案例,于是开通了播客,一方面便于自己日后翻阅,一方面给刚学习的小伙伴一个参考。

    今天先写一个简单的小案例:原生JS模拟百度搜索框。

    需求:

    1.当在输入框输入时,每输入一个文字,就会在下方展示相关内容列表

    2.每一次输入框输入,清空上一次内容

    3.鼠标移入列表内容时,对应的内容高亮显示,移出时恢复原状

    4.鼠标点击列表内容时,将列表内容显示到文本框,并且列表清空

    HTML页面结构部分

    1 <!-- 页面就只是一个简单文本框和按钮,在文本框底部用一个ul列表来展示相关内容 -->
    2 <div class="box">
    3     <div class="top">
    4         <input type="text" id="txt"/><input type="button" value="百度一下" id="search"/>
    5     </div>
    6     <ul id="keywords"></ul>
    7 </div>

    CSS样式部分

     1 <style>
     2         * {
     3             margin: 0;
     4             padding: 0;
     5         }
     6         body {
     7             font-size: 20px;
     8         }
     9         .box {
    10             width: 600px;
    11             height: 40px;
    12             margin: 200px auto;  /*大盒子页面居中 */
    13             position: relative;
    14         }
    15         .top{
    16             width: 605px;
    17             height: 40px;
    18         }
    19         #txt {
    20             width: 490px;
    21             height: 38px;
    22             border: 1px solid #CCCCCC;
    23             font-size: 18px;
    24             float: left;
    25             padding-left: 8px;
    26             outline: none;  /* 去除文本框获取焦点时的默认样式 */
    27         }
    28         #txt:focus{
    29             border: 1px solid #3385FF;            
    30         }
    31         #search {
    32             width: 100px;
    33             height: 40px;
    34             float: left;
    35             background-color: #3385FF;
    36             color: white;
    37             border: none;
    38             font-size: 16px;
    39         }
    40         #keywords {
    41             position: absolute;  /* ul相对父盒子定位 */
    42             top: 40px;
    43             left: 0;
    44             border: 1px solid #CCCCCC;
    45             border-top: none;
    46             list-style: none;  /* 去除无序列表默认自带的小圆点 */
    47             width: 498px;
    48             display: none;  /* 把ul隐藏起来,在获得相关内容时再显示出来,这样在搜索之前,页面只有一个搜索框和按钮 */
    49         }
    50         li {
    51             line-height: 24px;
    52             font-size: 16px;
    53             padding-left: 8px;
    54         }
    55     </style>

    JS行为部分

     1 <script> 
     2     // 定义一个存储相关内容的数组,模拟后台获取的数据,数组每个元素都是一个字符串
     3     var keywords = ["周杰伦", "周杰伦新专辑", "周杰伦等你下课", "陈奕迅", "陈奕迅演唱会", "陈奕迅歌手",
     4         "陈奕迅王菲","前端","前端开发","前端入门到放弃","前端要学什么","周润发","周润发赌神","周润发澳门风云","周末双休是国家规定吗","super junior",
     5         "JavaScript","Java","super junior成员","super junior成员强仁","super junior成员金英云","A short journey"];
     6 
     7     // 获取文本框,按钮和列表
     8     var txt=document.getElementById("txt");
     9     var search=document.getElementById("search");
    10     var kw=document.getElementById("keywords");
    11 
    12     // 给文本框注册一个键盘弹起事件,每按下一个按键弹起后,函数执行一遍
    13     txt.onkeyup= function () {
    14         kw.innerHTML="";  //每一次匹配数据前,先把列表清空,如果不清空会导致每一次获取的内容都叠加显示在列表上
    15 
    16         if(this.value){ //文本框里有输入内容时才进行数据匹配和显示
    17             for(var i=0;i<keywords.length;i++){  //遍历数组里的所有内容
    18                 if(keywords[i].indexOf(this.value)!=-1){  //如果文本框输入的字符或字符串能匹配到数组元素的字符串,就创建一个li标签,把数组的这个元素当成li标签的内容展示出来
    19                     var li=document.createElement("li"); 
    20                     li.innerHTML=keywords[i];
    21                     kw.style.display="block";
    22                     kw.appendChild(li); 
    23                     
    24                     //给新创建的每一个li标签注册一个鼠标移入和移出事件
    25                     li.onmouseover= function () {
    26                         this.defaultColor=this.style.backgroundColor; //定义一个defaultColor属性来存储li标签本来的背景颜色
    27                         this.style.backgroundColor="#F1F1F1";
    28                     };
    29 
    30                     li.onmouseout= function () {
    31                         this.style.backgroundColor=this.defaultColor;
    32                     };
    33                     // 给新创建的每一个li标签注册一个点击事件
    34                     li.onclick= function () {
    35                         txt.value=this.innerHTML; //将点击的列表内容显示到文本框                    
    36                     };
    37                 }
    38             }
    39         }
    40     };
    41    // 给整个HTML注册一个点击事件,清空列表并将列表隐藏
    42     document.documentElement.onclick= function () {
    43         kw.innerHTML="";
    44         kw.style.display="none";                                
    45     }
    46 </script>

    运行效果:

    这样就完成了一个用原生JS模拟百度搜索框的小案例,后面会陆续整理一些简单常见的小案例,也会记录一下自己工作遇到的一些问题,第一次写博,欢迎指正

  • 相关阅读:
    24种设计模式之适配器模式
    内存分配与回收策略
    java 吞吐量
    JVM运行数据区
    垃圾收集算法学习
    对象的回收
    未来一段时间学习方向
    多线程并发容器
    python基础数据类型--list列表
    Sublime Text 快捷键
  • 原文地址:https://www.cnblogs.com/linqb/p/9366108.html
Copyright © 2011-2022 走看看