JS-事件之鼠标、键盘都能控制的下拉选框效果

简介: window.onload=function(e){ var box=document.getElementById('divselect'), title=box.
<script type="text/javascript">
window.onload=function(e){
    var box=document.getElementById('divselect'),
        title=box.getElementsByTagName('cite')[0],
        menu=box.getElementsByTagName('ul')[0],
        as=box.getElementsByTagName('a'),//as是一个集合
        index=-1;
   
    // 点击三角时
    title.onclick=function(event){
        event = event || window.event;
        if(event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble = true;
        };//以上是阻止冒泡的判断语句
        menu.style.display = "block";
      
      //添加键盘事件
      //问题出在按了回车之后,怎么把对应的分类内容填进去。
      document.onkeyup = function(event){
        event = event || window.event;
//        console.log(event.keyCode)//用这个方法获取到:回车是13,空格是32,上键是38,下键是40;
        /***********
        if(event.keyCode===32){
            alert('kg');
        }else if(event.keyCode===13){
            //看来必须要是三个等号才会成立。
            alert('hc');
        }
        ********/
        if(event.keyCode===40){
            index++;
            if(index > as.length-1){
                index = 0
            };
            for(var i=0;i<as.length;i++){
                as[i].style.backgroundColor = null;
            };
            as[index].style.backgroundColor = "#ccc";
        };
        if(event.keyCode===38){
            index--;
            if(index<0){
                index = as.length-1;
            }
            for(var i=0;i<as.length;i++){
                as[i].style.backgroundColor = null;
            };
            as[index].style.backgroundColor = "#ccc";
        }
        if(event.keyCode===13){
            for(var i=0;i<as.length;i++){
                as[i].style.backgroundColor = null;
            };
            title.innerHTML = as[index].innerHTML;
                   menu.style.display = "none";
        }
     };
  };  
       //封装-命名函数
// var overColor = function(){
//         this.style.backgroundColor = "#ccc";
// }
//    function outColor(){
//         this.style.backgroundColor = null;
//     }
//    function replaceInner(){
//         title.innerHTML = this.innerHTML;
//         menu.style.display = "none";
//     }
   // 滑过滑过、离开、点击每个选项时
   for(var i=0;i<as.length;i++){
//     as[i].onmouseover = overColor;
//     as[i].onmouseout = outColor;
//     as[i].onclick = replaceInner;
//写法2——直接调用
    as[i].onmouseover = function(){
           this.style.backgroundColor = "#ccc";
           };
       as[i].onmouseout = function(){
           this.style.backgroundColor = null;
           };
       as[i].onclick = function(){
           title.innerHTML = this.innerHTML;
           menu.style.display = "none";
           };
    };//当实在找不到错误的时候,看看是不是不小心删掉了花括号啥的
   // 点击页面空白处时
   document.addEventListener('click',function(){
       //注意区分:attachEvent(ie中添加事件监听器的方法)和addEventListener(通用浏览器中添加事件监听器)。别搞混了写成attachEventListener了!!
       menu.style.display = "none";
   },false);

}
   </script>
<div id="divselect">
      <cite>请选择分类</cite>
      <ul>
         <li id="li"><a href="javascript:;" selectid="1">ASP开发</a></li>
         <li><a href="javascript:;" selectid="2">.NET开发</a></li>
         <li><a href="javascript:;" selectid="3">PHP开发</a></li>
         <li><a href="javascript:;" selectid="4">Javascript开发</a></li>
         <li><a href="javascript:;" selectid="5">Java特效</a></li>
      </ul>
    </div>
html
<style type="text/css">
body,ul,li{ margin:0; padding:0; font-size:13px;}
ul,li{list-style:none;}
#divselect{width:186px; margin:80px auto; position:relative; z-index:10000;}
#divselect cite{width:150px; height:24px;line-height:24px; display:block; color:#807a62; cursor:pointer;font-style:normal;
padding-left:4px; padding-right:30px; border:1px solid #333333; 
background:url(xjt.png) no-repeat right center;}
#divselect ul{width:184px;border:1px solid #333333; background-color:#ffffff; position:absolute; z-index:20000; margin-top:-1px; display:none;}
#divselect ul li{height:24px; line-height:24px;}
#divselect ul li a{display:block; height:24px; color:#333333; text-decoration:none; padding-left:10px; padding-right:10px;}
    </style>

任务
一、 点击菜单中的向下三角展开菜单
提示:
1、点击三角时需阻止事件冒泡
二、 展开菜单之后,在document对象上绑定keyup事件,(键盘事件不是某个具体的对象了,所以要帮到document上面来)按下向下方向键,选中下一个选项,按下向上方向键,选中上一个选项,按下回车键菜单收起,显示选中项
提示:
1、 声明一个全局的index变量初值为-1
2、 按下向下方向键时index递增,当递增至大于等于菜单选项的总数时恢复为0
3、 按下向上方向键时判断index,如若小于等于0则设为菜单选项的总数,之后递减index
4、 根据index值将对应的选项设为当前(灰色背景)
5、 按下回车键时将对应选中的选项设为菜单标题,且将所有选项设为无背景,index恢复为-1,菜单收起
注意:没有任何选项被选中时,按下回车键不做任何操作
三、鼠标滑过每个选项时高亮显示,离开时去掉背景,点击高亮选项时菜单标题改变
提示:
1.遍历所有a标签,绑定鼠标点击的事件
注意:要考虑到浏览器兼容,使用innerHTML,不要使用innerText
四、点击页面空白处收起菜单
提示:
1.绑定在document对象上

慕课练习题:http://www.imooc.com/code/3631

目录
相关文章
|
2月前
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
39 3
|
20天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
29 5
|
1月前
|
数据采集 存储 监控
实现自动化数据抓取:使用Node.js操控鼠标点击与位置坐标
本文介绍了如何使用Node.js和Puppeteer实现自动化数据抓取,特别是针对新闻网站“澎湃新闻”。通过设置代理IP、User-Agent和Cookie,提高爬虫的效率和隐蔽性,避免被网站封锁。代码示例展示了如何模拟鼠标点击、键盘输入等操作,抓取并整理新闻数据,适用于需要规避IP限制和突破频率限制的场景。
81 10
|
1月前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
41 4
|
2月前
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
50 6
|
2月前
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
140 0
|
2月前
|
前端开发 JavaScript 安全
前端JS实现密码校验键盘横竖、26字母、相同字母、相同数字、密码包含用户名、数字 字母不能连续 不能相同三个、不能横向 竖向 连续三个 包含字符、不能有中文符号
该 JavaScript 代码实现了一个严格的密码校验功能,确保密码满足多种安全要求,包括长度、字符类型、不包含中文及特殊字符、不与用户名相似等。通过多个辅助函数,如 `validateFormat` 检查密码格式,`isHasChinaCharFun` 检测中文符号,`getCharAll` 生成键盘组合,以及 `checkPasswordFun` 综合验证密码的有效性和安全性。此工具对于提高用户账户的安全性非常有用。
52 0
|
2月前
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
58 0
|
2月前
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
|
2月前
|
JavaScript 前端开发 Android开发
JavaScript触摸touch事件
JavaScript触摸touch事件