模仿百度搜索框

作者: AlanV | 来源:发表于2017-09-06 22:23 被阅读46次
  <!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>百度搜索框</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    #box {
      width: 400px;
      margin: 200px auto;
      /*border: 1px solid #000;*/
    }

    #txtSearch {
      width: 300px;
    }

    #pop {
      width: 300px;
      border: 1px solid red;
      padding: 0px;
    }

    #pop ul {
      list-style-type: none;
      margin: 5px;
      padding: 0px;
    }

  </style>
</head>
<body>
<div id="box">
  <input type="text" value="" id="txtSearch"/>
  <input type="button" value="搜索" id="btnSearch"/>
  <!--<div id="pop">-->
  <!--<ul>-->
  <!--<li>a</li>-->
  <!--<li>ab</li>-->
  <!--<li>abc</li>-->
  <!--<li>abcd</li>-->
  <!--<li>abcde</li>-->
  <!--<li>amm</li>-->
  <!--</ul>-->
  <!--</div>-->
</div>
</body>
</html>
<script src="common.js"></script>
<script>
  // 当我们在输入框中键盘按下,并抬起的时候,就会向服务器发送一条ajax请求,去服务器的数据库中查询以用户输入的内容为开头的数据,如果找到了,则将这些数据返回给浏览器,渲染到指定的位置

  // 用本地数组模拟一下数据库
  var strs =["a","ab","abc","abcd","abcde","acc","amm","mmm","kkk"];

  // 1. 获取要操作的对象
  var box = $$("box");
  var txtSearch = $$("txtSearch");
  // 2. 给事件源注册事件
  txtSearch.onkeyup  = function (){
    // 3.先获取一下输入框中的数据
    var value = txtSearch.value;
    // 4. 到数据库中查询,数组中的哪些元素是以用户输入的内容为开头的数据,如果找到了,就需要存到一个新的数组当中
    var filterArr = []; // filter过滤
    for(var i = 0; i < strs.length; i++) {
       // 如果当前的数据在数组中的元素当中的索引位置是0的话,就可以把数组当中的这个元素,看成是以用户输入的内容为开头的数据
      // strs[i]是数组中的遍历到的每一项,是一个字符串,然后判断这个字符串是不是以用户输入的内容为开头的数据
      if(strs[i].indexOf(value)==0){
        filterArr.push(strs[i]);
      }
    }
    //11. 在生成新的盒子之前先把旧的盒子清除掉
    var divPop = $$("pop");
    if(divPop){
      box.removeChild(divPop);
    }

    //12.如果过滤数组中的元素为空的话,就不要往下执行,就是说不要再创建div和ul
    if(!filterArr.length){
        return;// 退出函数,下面的代码都不会执行
    }
    //13.如果输入框里面的内容为空的话,不用再往下执行代码,不需要创建元素
    if(!value){
        return; //退出函数
    }
    // 循环遍历完数组之后,filterArr里面就存了以用户输入的内容为开头的数据
    //5. 动态的创建元素,首先创建div
    divPop = document.createElement("div");
    divPop.setAttribute("id","pop");
    box.appendChild(divPop);
    // 6. 创建ul
    var ul = document.createElement("ul");
    divPop.appendChild(ul);
    // 7. 创建li标签 ,要根据filterArr数组中的元素的个数创建对应的li标签
    for(var i = 0; i < filterArr.length; i++) {
         var li = document.createElement("li");
        Txt.setText(li,filterArr[i]); // 给每个li标签添加文本内容
        ul.appendChild(li); // 将li标签添加到ul中
      //8. 给每个li标签添加鼠标移入的事件,让当前行的背景颜色变成灰色
      li.onmouseover = function (){
             this.style.backgroundColor = "#d0d0d0";
      }
      //9. 鼠标离开的时候,要还原原来的颜色
      li.onmouseout = function (){
             this.style.backgroundColor = "#fff";
      }
      // 10. 选中当前行的时候,要让当前行的内容填充在输入框中,盒子不要了
      li.onclick = function (){
            txtSearch.value = Txt.getText(this);
        box.removeChild(divPop);
      }
    }
  }


  // 1. 键盘按下并抬起的时候,获得用户输入的数据
  // 2. 拿着用户输入的数据,去数据库搜索以用户输入的内容为开头的数据
  // 3. 找到以用户输入的内容为开头的数据,存入新的容器中
  // 4. 根据匹配到的数据(根据新数组的长度,来动态的生成列表中的li),动态的生成列表
  // 5. 判断特殊情况
</script>

相关文章

网友评论

    本文标题:模仿百度搜索框

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