美文网首页web基础学习之路
第十周第一天笔记

第十周第一天笔记

作者: 果木山 | 来源:发表于2018-09-27 00:03 被阅读0次

百度搜索框实例

  • 思路:
    • 给input添加鼠标聚焦事件和键盘抬起事件;目的:获取数据,绑定数据
      • 判断:判断文本框中是否存在内容,如果不存在,就不进行获取数据等操作,ul要隐藏,如果存在数据,ul要显示;
      • 通过jQuery中的ajax来获取数据,绑定数据
      • 前后台的数据交互,通过ajax怎样获取数据
        • 请求地址:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=周星驰&cb=xxx
          • 地址url:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su,是一个百度服务器上的一个地址,在这个地址上已经有强大的数据库被编写好,怎样去获取相对应的数据,通过wd=后面的赋值,来匹配已经编好的内容,wd=怎么设置,是通过ajax上的data属性设置
          • data:"wd="+val指的是将wd的值赋为文本框中的内容,通过改变文本框中的文字,来获取不同的数据
          • dataType:jsonp,指的是跨域获取,返回的数据格式为json格式;
          • json:参数用来设置cb,在默认情况下为callback,此时的值为随机数;
    • 添加点击事件,事件委托给最高级body,通过判断事件源来进行相应的操作
      • 需求1:当鼠标点击列表的时候,对应的内容框变为我们点击的文字,同时开始搜索
        • 判断事件源为a元素,并且a元素的父级为li,这样就代表点击的是列表中的a元素;
        • 怎样跳转页面进行搜索
          • 代码:window.open("https://www.baidu.com/s?wd="+$(target).html(),"_blank");,其中https://www.baidu.com/s?wd=为百度搜索的东西,给wd赋值为什么内容,它就相应的跳转到对应的页面,所以只要给wd赋值为列表中内容就行,至于为什么,待以后解答;
      • 需求2:当鼠标点击百度一下按钮,开始搜索
        • 判断事件源为button元素,然后将文本框内容赋给wd即可;
      • 需求3:当点击除了按钮和列表以外的任何点击都让ul隐藏
        • 添加代码:$ul.hide()
        • 注意:如果此时点击文本框时,会通过冒泡事件,将body点击事件触发,然后执行ul隐藏的代码,会出错,所以必须在此之前,要判断事件源是否为input元素,如果为input则阻断程序执行;此时设置的代码return false,有三个功能;
    • 添加键盘按下事件
      • 需求:当按上下键的时候,文本框的内容同步改变,按下enter键,开始搜索,并且让ul隐藏
      • 思路:
        • 如何判断按下的哪一个键:通过判断事件对象上的keyCode属性,其中:enter键: ,向下键:40,向上键:38;
        • 怎样获取列表中的内容,通过全局变量n,当触发一次事件就让n相应的加1或减1,通过给对应的li元素添加一个class名,来改变其背景色;
      • 注意点:
        • 当按下向下向上键的时候,必须解绑keyup事件,当重新输入内容的时候,也就是触发keydown的时候,除了三个键的情况,其他情况均重新绑定keyup事件;
        • 当按下enter键时,跳转新页面后,必须重新赋值n为原始值;
        • 重复绑定keyup事件后,要给n重新赋值为原始值;不然n会错乱;
        • 在向上向下键的按下过程中,当回到文本框的时候,必须给其赋值为最初输入在文本框内的内容;所以需要建立一个全局的变量,用于保存住最原始的文本框内容;通过if判断,只给其赋值一次,不能重复赋值;
  • 知识点:
    • jQuery中在函数中添加代码:return false的作用有三种:1)阻止程序执行;2)阻止默认事件;3)阻止冒泡;
  • 问题:
    • 按下enter键跳转页面后,无法隐藏ul;即使是解绑keyup,也无法隐藏ul;
    • 当鼠标滑动到列表项时,对应的背景色会发生改变,但是按下向下上键时,背景色也会变化,二者会同时存在,而真正的百度上,是鼠标浮动事件和向上向下键是配合的;(这个问题可以给li添加mouseover和mouseout事件,而不是利用css中的hover伪元素设置);
  • 代码:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>百度搜索框实例</title>
         <style>
             *{
                 margin: 0;
                 padding: 0;
                 list-style: none;
             }
             body,html{
                 height: 100%;
             }
             .menu{
                 width: 100%;
                 height: 32px;
                 background-color: lightslategray;
             }
             #wrap{
                 width: 640px;
                 margin: 10px auto 0;
             }
             #logo{
                 height: 180px;
                 padding-top: 35px;
             }
             #logo img{
                 display: block;
                 width: 270px;
                 height: 129px;
                 line-height: 129px;
                 vertical-align: middle;
                 margin: 0 auto;
             }
             #boxbanner{
                 position: relative;
             }
             #boxbanner #txt{
                 display: inline-block;
                 width: 520px;
                 height: 20px;
                 font-size: 18px;
                 padding: 9px 7px;
                 border: 1px solid lightgray;
                 outline: none;
                 box-shadow: none;
                 vertical-align: top;
             }
             #boxbanner button{
                 width: 102px;
                 height: 40px;
                 line-height: 40px;
                 font-size: 18px;
                 text-align: center;
                 background-color: #38f;
                 color: white;
                 box-shadow: none;
                 font-weight: normal;
                 border: 0;
                 padding: 0;
                 cursor: pointer;
             }
             #boxbanner ul{
                 position: absolute;
                 left: 0;
                 top: 40px;
                 width: 637px;
                 display: none;
                 border: 1px solid lightgray;
             }
             #boxbanner ul li{
                 width: 100%;
                 height: 30px;
             }
             #boxbanner ul li:hover{
                 background-color: lavender;
             }
             #boxbanner ul li.active{
                 background-color: lavender;
             }
             #boxbanner ul li a{
                 display: block;
                 color: black;
                 font-size: 14px;
                 line-height: 30px;
                 text-decoration: none;
                 padding-left: 7px;
             }
         </style>
     </head>
     <body>
     <div class="menu"></div>
     <div id="wrap">
         <div id="logo"><img src="img/logo.png" alt="loge"></div>
         <div id="boxbanner">
             <input type="text" id="txt"><button id="btn">百度一下</button>
             <ul id="ul">
                 <!--<li><a href="javascript:;">百度一下</a></li>
                 <li><a href="javascript:;">百度一下</a></li>
                 <li><a href="javascript:;">百度一下</a></li>
                 <li><a href="javascript:;">百度一下</a></li>
                 <li><a href="javascript:;">百度一下</a></li>-->
             </ul>
         </div>
     </div>
     <script src="JS库/jquery.js"></script>
     <script>
         //请求地址:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=周星驰&cb=xxx
         //上面的地址是百度的数据库中添加的一个后台大数据;目的就是当你搜索的时候,能够匹配到相应的信息;
         /*UL显示的情况
         * 1)当聚焦的时候,如果文本框内有内容,ul显示,否则,隐藏
         * 2)在编辑内容的时候,如果有内容,ul显示,否则隐藏,同时,编辑内容的时候,列表跟着同步改变;
         * 3)当鼠标点击列表的时候,对应的内容框变为我们点击的文字,同时开始搜索
         * 4)点击百度一下按钮,开始搜索,并且让ul隐藏
         * 5)点击页面任何地方的时候,ul都隐藏
         * 6)当按上下键的时候,文本框的内容同步改变,按下enter键,开始搜索
         * */
         //获取元素
         var $txt=$("#txt");
         var $ul=$("#ul");
         var $aLi=null;
         var $n=-1;
         //oldval目的是保存最初的文本框内容
         var oldval=null;
         //1 添加聚焦事件,键盘抬起事件
         $txt.on("focus keyup",getData);
         function getData() {
             var val=$(this).val();
             console.log(2)
             if(val.length){
                 //获取数据,绑定数据
                 //请求地址:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=周星驰&cb=xxx
                 //url为问号前面的地址,data来设置wd=xxx,dataType为跨域获取,jsonp用来修改cb,如果不修改,则默认为callback,值为随机数;
                 $.ajax({
                     url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
                     data:"wd="+val,
                     dataType:"jsonp",
                     jsonp:"cb",
                     success:function (data) {
                         //绑定数据
                         var str="";
                         for(var i=0; i<data.s.length; i++){
                             str+=`<li><a href="javascript:;">${data.s[i]}</a></li>`;
                         }
                         $ul.html(str);
                         //数据更新后要重新获取数据,因为jQuery中没有DOM映射;
                         $aLi=$ul.children("li");
                     }
                 });
                 $ul.show();
             }else{
                 $ul.hide();
             }
         }
         //2 添加点击事件,事件委托给最高级元素body
         $("body").on("click",function (e) {
             var target=e.target;
             //2.1当鼠标点击列表的时候,对应的内容框变为我们点击的文字,同时开始搜索,并且让ul隐藏
             if(target.tagName.toLowerCase()==="a" && target.parentNode.tagName.toLowerCase()==="li"){
                 $txt.val($(target).html());
                 window.open("https://www.baidu.com/s?wd="+$(target).html(),"_blank");
             }
             //2.2点击百度一下按钮,开始搜索
             if(target.tagName.toLowerCase()==="button"){
                 window.open("https://www.baidu.com/s?wd="+$txt.val(),"_blank");
             }
             //2.3点击页面任何地方的时候,ul都隐藏,排除txt,button,a
             if(target.tagName.toLowerCase()==="input"){
                 //当聚焦input的时候,会默认发生点击事件,所以会发生冒泡,导致ul隐藏
                 return false;//阻止冒泡
             }
             $ul.hide();
         });
         //3 当按上下键的时候,文本框的内容同步改变,按下enter键,开始搜索
         //注意:jQuery中没有DOM映射;
         $txt.on("keydown",function (e) {
             if(e.keyCode===40){
                 if(!oldval){
                     oldval=$(this).val();
                 }
                 //当按下下键时,让对应的li背景色改变,通过n来控制
                 $(this).off("keyup",getData);
                 $n++;
                 $n%=$aLi.length+1;
                 if($n===$aLi.length){
                     $aLi.removeClass("active");
                     $(this).val(oldval);
                     return;
                 }
                 $aLi.eq($n).addClass("active").siblings("li").removeClass("active");
                 $(this).val($aLi.eq($n).children("a").html());
             }else if(e.keyCode===38){
                 if(!oldval){
                     oldval=$(this).val();
                 }
                 //当按下下键时,让对应的li背景色改变,通过n来控制
                 $(this).off("keyup",getData);
                 if($n===0){
                     $aLi.removeClass("active");
                     $(this).val(oldval);
                     $n=-1;
                     return;
                 }
                 if($n<0){
                     $n=$aLi.length;
                 }
                 $n--;
                 if($n===$aLi.length){
                     $aLi.removeClass("active");
                     $(this).val(oldval);
                     return;
                 }
                 $aLi.eq($n).addClass("active").siblings("li").removeClass("active");
                 $(this).val($aLi.eq($n).children("a").html());
             }else if(e.keyCode===13){
                 window.open("https://www.baidu.com/s?wd="+$(this).val(),"_blank");
                 $n=-1;//此时$n必须要重新赋值为原始值;
             }else{
                 $(this).on("keyup",getData);
                 $n=-1;//此时$n必须要重新赋值为原始值;
             }
         });
     </script>
     </body>
     </html>
    

百度搜索框复习版

  • 代码:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>百度搜索框实例复习</title>
         <style>
             *{
                 margin: 0;
                 padding: 0;
                 list-style: none;
             }
             body{
                 font: 16px Arial;
                 height: 1000px;
             }
             .nav{
                 width: 100%;
                 height: 32px;
                 border-bottom: 1px solid #ccc;
             }
             .sou{
                 width: 640px;
                 height: 260px;
                 margin: 0 auto;
             }
             .sou a{
                 display: block;
                 width: 270px;
                 margin: 10px auto;
                 height: 129px;
                 text-decoration: none;
                 background: url("img/bd1.png") no-repeat;
             }
             .sou p{
                 width: 640px;
                 height: 40px;
                 margin: 0 auto;
             }
             .sou p input{
                 width: 536px;
                 height: 40px;
                 padding: 9px 48px 9px 7px;
                 border: 1px solid #b8b8b8;
                 box-sizing: border-box;
                 outline: none;
                 box-shadow: none;
                 font: 16px Arial;
             }
             .sou p input[type="text"]:focus{
                 border-color: #38f;
             }
             .sou p i{
                 display: inline-block;
                 width: 18px;
                 height: 16px;
                 background: url("img/02.png") no-repeat;
                 background-position: 0 0;
                 position: absolute;
                 margin-left: -30px;
                 margin-top: 12px;
                 cursor: pointer;
             }
             .sou p i:hover{
                 background-position: 0 -20px;
             }
             .sou p span{
                 display: inline-block;
                 width: 104px;
                 height: 40px;
                 line-height: 40px;
                 font-size: 16px;
                 color: white;
                 text-align: center;
                 background-color: #398bfb;
                 border: 1px solid #398bfb;
                 box-sizing: border-box;
                 vertical-align: top;
                 cursor: pointer;
             }
             .sou p span:hover{
                 background-color: #39f;
             }
             .sou ul{
                 width: 640px;
                 position: absolute;
                 border: 1px solid lightgray;
                 box-sizing: border-box;
                 font-size: 14px;
                 display: none;
             }
             .sou ul li{
                 width: 100%;
                 height: 30px;
                 line-height: 30px;
                 padding-left: 7px;
                 box-sizing: border-box;
                 cursor: pointer;
             }
             .sou ul li.active{
                 background-color: lightsteelblue;
             }
         </style>
     </head>
     <body>
     <div class="nav"></div>
     <div class="sou">
         <a href="https://www.baidu.com/s?wd=%E4%BB%8A%E6%97%A5%E6%96%B0%E9%B2%9C%E4%BA%8B&tn=SE_Pclogo_6ysd4c7a&sa=ire_dl_gh_logo&rsv_dl=igh_logo_pc" title="点击一下,了解更多" target="_blank"></a>
         <p><input type="text" name="search" id="ser"/><i></i><span id="btn">百度一下</span></p>
         <ul>
             <!--<li>天空</li>-->
         </ul>
     </div>
     <script src="../toolLibrary/jquery.js"></script>
     <script>
         //获取元素
         var $oInput=$("#ser");
         var $oUl=$(".sou ul");
         var $oinputVal=null;
         var $aLi=null;
         var data=null;
         var daLength=null;
         var n=-1;
         //1.获取数据
         function getData() {
             //每次事件触发后,重新获取内容;
             $oinputVal=$oInput.val();
             if($oinputVal.length>0){
                 $.ajax({
                     url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
                     type:"get",
                     data:{wd:$oinputVal},
                     dataType: "jsonp",
                     jsonp:"cb",
                     success:function (val) {
                         data=val.s;
                         daLength=data.length;
                         insertDom();
                     },
                     error:function (err) {
                         console.log(err);
                     }
                 })
             }
         }
         //2.将数据插入页面
         function insertDom() {
             var str="";
             $.each(data,function (index,item) {
                 str+=`<li>${item}</li>`;
             });
             $oUl.html(str);
             $aLi=$oUl.children("li");
             //li设置鼠标划上事件;
             $aLi.mouseover(function () {
                 n=$(this).index();
                 $(this).addClass("active").siblings("li").removeClass("active");
             }).mouseout(function () {
                 n=-1;
                 $(this).removeClass("active");
             });
         }
         //3.文本框添加事件
         keyEvent();
         function keyEvent() {
             //keyup事件,更新数据,绑定DOM0级事件,不会出现重复绑定的方法;
             $oInput[0].onkeyup=keyUp;
             function keyUp(){
                 //让ul显示
                 $oUl.show();
                 //获取新的数据,插入页面中;
                 getData();
             }
             //keydown事件
             $oInput.on("keydown",keyDown);
             function keyDown(e) {
                 //向下为40,向上为38;
                 if(e.keyCode===40 || e.keyCode===38){
                     $oInput[0].onkeyup=null;
                     if(e.keyCode===40){
                         console.log("todown");
                         if(n>=daLength-1){
                             $aLi.eq(n).removeClass("active");
                             n=-1;
                             $oInput.val($oinputVal);
                             return;
                         }
                         n++;
                     }
                     if(e.keyCode===38){
                         console.log("toup");
                         if(n<=0){
                             n=daLength;
                             if(n===0){
                                 $aLi.eq(n).removeClass("active");
                                 $oInput.val($oinputVal);
                                 return;
                             }
                         }
                         n--;
                     }
                     $aLi.eq(n).addClass("active").siblings("li").removeClass("active");
                     $oInput.val($aLi.eq(n).html());
                     set_text_value_position(this, -1);  //让文本框内的光标位置在最后面;
                 }else{
                     //回车键盘码为13;回车跳转页面
                     if(e.keyCode===13){
                         toBlank($oInput.val());
                     }
                     $oInput[0].onkeyup=keyUp;
                 }
             }
             //点击事件,事件委托在外围容器上
             $("body").click(function (e) {
                 if(e.target.id==="btn"){
                     toBlank($oInput.val());
                 }
                 if(e.target.id==="ser"){
                     getData();
                     $oUl.slideDown(500);
                 }else{
                     $oUl.slideUp(300);
                     n=-1;
                 }
                 if(e.target.nodeName==="LI"){
                     $oInput.val(e.target.innerHTML);
                     toBlank(e.target.innerHTML);
                 }
             });
         }
         //4.跳转页面
         function toBlank(arg) {
             var t=/^\s+$/.test(arg);//筛选空格,如果为多个空格,页面也不跳转;
             if(!arg || t) return;
             window.open("https://www.baidu.com/s?wd="+arg);
         }
         //让文本框内的光标位置在最后面;
         function set_text_value_position(tobj, spos){
             if(spos<0)
                 spos = tobj.value.length;
             if(tobj.setSelectionRange){ //兼容火狐,谷歌
                 setTimeout(function(){
                         tobj.setSelectionRange(spos, spos);
                         tobj.focus();}
                     ,0);
             }else if(tobj.createTextRange){ //兼容IE
                 var rng = tobj.createTextRange();
                 rng.move('character', spos);
                 rng.select();
             }
         }
     
     
     </script>
     </body>
     </html>
    

相关文章

  • 十三周的视频资料目录及笔记

    第一周至第十三周视频文件目录及笔记连接 第一周 第一天标题与无序列表粗体、斜体、代码块有序列表,图片和链接引入表格...

  • 2014301020155

    第九周作业:第九周作业 第十周作业:第十周作业 第十一周作业:第十一周作业 第十三周作业:第十三周作业 第十四周作...

  • 第十周第一天笔记

    百度搜索框实例 思路:给input添加鼠标聚焦事件和键盘抬起事件;目的:获取数据,绑定数据判断:判断文本框中是否存...

  • 第七周到第十三周复习笔记

    第七周到第十三周知识复习笔记 第七周 JS盒子模型client类offset类scroll类 字符串search(...

  • 山东宇悦妈读经记录

    日期:2018年12月21日 周期:第七周第一天 读经内容: 1.《周易•随卦第十七—临卦第十九》 名句语录:《象...

  • 山东宇悦妈读经记录

    日期:2018年11月29日 周期:第五周第一天 读经内容: 1.《周易•上经•泰卦第十一—同人卦第十三》 名句语...

  • 《架构师训练营》之大数据应用

    极客时间《架构师训练营》第十三周学习笔记 Spark 架构 Spark 则是 UC Berkeley AMP la...

  • 山东宇悦妈读经记录

    日期:2018年12月6日 周期:第六周第一天 读经内容: 1.《周易•上经•大有卦第十四—豫卦第十六》 名句语录...

  • 2018-05-09

    2018年开学第十周第一天 2017年5月7日 星期一 多云 妈妈和宝贝系统读经第147周第1...

  • 回顾过去,展望未来

    开学第十九周第一天 2017年1月1日 星期一 多云 妈妈和宝贝系统读经第130周第1天,累积911天 ...

网友评论

    本文标题:第十周第一天笔记

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