IFE JavaScript Task0002-4 小练习4:输入提示框

小练习4:输入提示框

任务描述

在和上一任务同一目录下面创建一个task0002_4.html文件,在js目录中创建task0002_4.js,并在其中编码,实现一个类似百度搜索框的输入提示的功能。

要求如下:

  • 允许使用鼠标点击选中提示栏中的某个选项
  • 允许使用键盘上下键来选中提示栏中的某个选项,回车确认选中
  • 选中后,提示内容变更到输入框中

初级班:

  • 不要求和后端交互,可以自己伪造一份提示数据例如:

      var suggestData = ['Simon', 'Erik', 'Kener'];

自己搭建一个后端Server,使用Ajax来获取提示数据中级班:

示例:

示例

思路

先拆分步骤进行。

简单分析下实现这个功能应有什么步骤了?

  • 允许使用鼠标点击选中提示栏中的某个选项(鼠标点击)
  • 允许使用键盘上下键来选中提示栏中的某个选项,回车确认选中(键盘事件)
  • 选中后,提示内容变更到输入框中(?)

初步设想有“chick”,"keydown";

当然鼠标移入移出事件也是应该加入的“mouseover”,“mouseleave”;

  • 选中后,提示内容变更到输入框中(?)

谷歌了下监视输入框的值变化可以用:“标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化”

参考文章:http://www.cnblogs.com/lhb25/archive/2012/11/30/oninput-and-onpropertychange-event-for-input.html

选中提示:在选定元素上添加选中的样式就可以了;

 

(1)首先先在html设置好“li”的内容

点击输入框在下面弹出“li”列表;

先为input绑定“chick”事件,单击就显示列表;先不考虑什么时候隐藏列表;

然后鼠标移入列表(一开始打算是通过js来改变样式,后来试了下用hover也可以,更方便),点击之后添加内容到输入框里面(innerHtml),然后列表就设置自动隐藏了(display:none);

既然是每个li的话都有可能发生事件的话,那么就采用事件代理对每个“li”进行绑定事件(addEventListener)。

(2)对键盘事件进行判断

当点击输入框时候(我在代码里改为了“focus”事件);

按下键盘“下”键,这时候判断下“li”列表没有没被选中,

1、如果有,获取此时是选中样式“active”的元素,该元素去除“active”样式,下一个兄弟元素添加选中样式“active”;(这里选取下一个兄弟元素用"nextElementSibling"方法进行选取);

2、如果无,那就将第一个“li”设置为“active”;

3、同理按键盘“上”键也是一样;不过这里就用previousElementSibling方法;

4、按下确定键,处理的方法与鼠标点击类似;获取并添加当前内容;

5、这里做了点小的用户体验优化,等按上下键按到列表的最顶或者最底,弹出提示信息告知用户;同时也免得浏览器报错啊。

 

(3)提示内容变更到输入框中

上面说到用“input ”事件,监听输入框里面的数据;

首先清除掉之前设置的“li”;

当输入框里面的数据进行变更的时候,与提示数据textdate进行对比;

这里用了array.filter和.match方法;得到符合的数组元素后,在一个个进行输出就好了。

 

 

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        ul,li{
            padding: 0;
            margin: 0;
            list-style-type: none;
        }
        li{
            background-color: #f4f4f4;
        }
        .list{
            width:184px;
        }
        .text{
            width: 180px;
        }
        .date{
            display: none;
        }
        .date li:hover{
            background-color: #1f8af1;
            color: #fff
        }
        .active{
            background-color: #1f8af1;
            color: #fff
        }

    </style>
</head>
<body>
<p>test</p>
<div class="list">
<input type="text" class="text">
<ul class="date">

</ul>
</div>
</body>
<script>
    var testdate=["abase","abash","abate","abduction","abhor","abominable","abscond","abstain","baby","babysiter","belt","birthday","bench","brave","你好"];
    var text=document.getElementsByClassName("text")[0];
    var oUl=document.getElementsByClassName("date")[0];
    var oLi=document.querySelectorAll(".date li");
    text.addEventListener("focus",function(e){//文本框点击事件
        if(text.value=""){
            oUl.innerHTML="";
        }
        else{

            document.onkeydown = function (e) {
           if(e.keyCode==40){
               var actli=document.querySelector(".active");
             if(actli){
                 if(actli.nextElementSibling==null){
                     alert("已经是最底了");
                     return false;
                 }
                 actli.nextElementSibling.className="active";
                 actli.className="";

             }
               else{
                   var oLi=document.querySelectorAll(".date li");
                   oLi[0].className="active";
             }
           };
            if(e.keyCode==38){
                var actli=document.querySelector(".active");
                if(actli){
                    if(actli.previousElementSibling==null){
                        alert("已经是最顶了")
                        return false;
                    }
                    actli.previousElementSibling.className="active";
                    actli.className="";

                }
            }
            if(e.keyCode==13){
                var actli=document.querySelector(".active");
                var val=actli.innerText;
                text.value=val;
                actli.className="";
                oUl.style.display="none";
            }
        }//下拉栏键盘事件
    } });
    oUl.addEventListener("mouseover",function(e){//下拉栏鼠标移入事件
        var actli=document.querySelector(".active");
        if(actli){
            actli.className="";
        }
    });
    oUl.addEventListener("mouseleave",function(e){//下拉栏鼠标移出事件
        oUl.style.display="none";
        oUl.innerHTML=""
    });
    oUl.addEventListener("click",function(e){//下拉栏鼠标点击事件
        var val=event.target.innerText;
        text.value=val;
        oUl.style.display="none";
    });
    text.oninput=check;//监听input的值
    function check(){
            var input=text.value;
            if(input===""){
                oUl.innerHTML="";
            }
        else{ oUl.style.display="block"
                var result;
                var reg= new RegExp("^" +text.value, "i");
                result=testdate.filter(function(item){
                    return item.match(reg);
                });
                var litext="";
                for(var i=0;i<result.length;i++){
                    litext+= "<li>"+result[i]+"</li>"
                    oUl.innerHTML=litext;
                }
            }





    }
</script>
</html>

 

转载于:https://www.cnblogs.com/spezz07/p/5821863.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
折叠面板是一个常见的 UI 组件,可以在 Web 页面上实现内容的展开与收缩。以下是一个 HTML 右边折叠面板的实现示例: HTML 代码: ```html <div class="panel-container"> <div class="panel-header"> <h3>折叠面板标题</h3> <span class="panel-arrow"></span> </div> <div class="panel-content"> <p>折叠面板内容</p> </div> </div> ``` CSS 代码: ```css .panel-container { position: relative; width: 400px; height: 100%; } .panel-header { position: relative; z-index: 1; height: 40px; background-color: #f0f0f0; border-bottom: 1px solid #d9d9d9; cursor: pointer; } .panel-header h3 { margin: 0; padding: 0 20px; line-height: 40px; font-size: 16px; font-weight: bold; color: #333; } .panel-arrow { position: absolute; top: 50%; right: 20px; width: 0; height: 0; margin-top: -5px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #999; transition: transform 0.3s ease; } .panel-content { position: absolute; top: 40px; right: 0; z-index: 0; width: 0; height: 0; overflow: hidden; background-color: #fff; transition: width 0.3s ease; } .panel-container.active .panel-header .panel-arrow { transform: rotate(180deg); } .panel-container.active .panel-content { width: 300px; height: 300px; } ``` 解释: 1. `.panel-container` 设置容器的宽度和高度,并设置为相对定位,以便内部元素进行定位。 2. `.panel-header` 设置折叠面板的标题栏样式,包括高度、背景色、边框和光标样式。 3. `.panel-header h3` 设置标题栏标题的样式,包括字体大小、颜色和粗细等。 4. `.panel-arrow` 设置标题栏右侧的箭头样式,包括定位、大小和颜色等。使用 `transition` 属性实现箭头旋转效果。 5. `.panel-content` 设置折叠面板的内容区样式,包括定位、大小、背景色和过渡效果等。使用 `overflow: hidden` 属性隐藏内容超出部分。 6. `.panel-container.active .panel-header .panel-arrow` 和 `.panel-container.active .panel-content` 通过 `.active` 类实现面板的展开和收缩效果。 以上是一个简单的 HTML 右边折叠面板的实现示例。可以根据实际需求调整样式和布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值