编程挑战--下拉菜单

最近有一个叫慕客网的学习平台,现在很火。课程后面一般都会留有一道小题目,用来检测小伙伴们的学习结果。我看到有一个课程还不错,后面也跟了很多回复,不过感觉代码质量都不高,这可能和课程定位有关,如果你有信心写的更好,不妨来挑战一下。有兴趣的同学可以参考下面的链接:

课程地址:http://www.imooc.com/code/3631

我把题目要求再贴一下:

编程挑战

小伙伴们,根据所学知识,实现下图所示的菜单效果,实现点击菜单中的向下三角展开菜单,点击页面空白处收起菜单,按下键盘上的向上、向下方向键可以选中对应的选项,鼠标点击或按下回车键将当前高亮的选项内容设为菜单的标题

效果图:

初始:

点击出现:

点击之后:

要求就这么多,我看到小伙伴们实现的都差不多,无非就是一个一个的循环邦定事件。完全是按提示做的,没有自己的创新。

下面我贴下自己的代码:

/**
       *  下拉菜单
       *  @param {string} id 节点#ID
       */
      function Selecter (id) {
          var parent = document.getElementById(id),
              nodes = parent.children;
          this.parent = parent;
          this.title = nodes[0];
          this.menu = nodes[1];
          this.init();
      }

      /**
       * 初始化
       */
      Selecter.prototype.init = function(){
        var doc = document;
        this.selected = null;
        this.maxLen = this.menu.children.length;
        doc.addEventListener(‘click‘,this,false);
        doc.addEventListener(‘keydown‘,this,false);
        this.menu.addEventListener(‘mouseover‘,this,false);
        this.menu.addEventListener(‘mouseout‘,this,false);
      }

      /**
       * 事件处理
       * @param {object} event 事件对象
       */
      Selecter.prototype.handleEvent = function(event){
        var target = event.target || event.srcElement;
        switch(target.nodeName){
          //点击三角时
          case ‘CITE‘:
            this.menuShow();
            break;
           // 滑过滑过、离开、点击每个选项时
          case ‘A‘:
            this.removeLight();
            this.selected = target;
            this.menuUpdate();
            this.hightLight();
            if(event.type==‘click‘){
              this.menuHide();
            }
            break;
            // 点击页面空白处时
          case ‘HTML‘:
            this.menuHide();
            break;
          //键盘操作
          default:
            this.keydown(event.keyCode);
            break;
        }
        return
      }

      /**
       *  更新菜单值
       */
      Selecter.prototype.menuUpdate = function(){
        this.title.innerHTML = this.selected.innerHTML;
      }

      /**
       * 高亮选中项
       */
      Selecter.prototype.hightLight = function(){
        if(this.selected){
          this.selected.style.backgroundColor = ‘gray‘;
        }
      }

      /**
       * 移除高亮
       */
      Selecter.prototype.removeLight = function(){
        if(this.selected){
          this.selected.style.backgroundColor = ‘white‘;
        }
      }

      /**
       * 显示菜单项
       */
      Selecter.prototype.menuShow = function(){
        this.menu.style.display = ‘block‘;
        this.hightLight();
      }

      /**
       * 隐藏菜单项
       */
      Selecter.prototype.menuHide = function(){
        this.menu.style.display = ‘none‘;
      }

      /**
       * 取下一项
       */
      Selecter.prototype.next= function(){
        var target = this.selected;
        var index = target ? target.getAttribute(‘selectid‘)-1 : -1;

        this.removeLight();
        index = ++index % this.maxLen;
        this.selected = this.menu.children[index].children[0];
        this.hightLight();
      }

      /**
       * 取上一项
       */
      Selecter.prototype.prev = function(){
        var target = this.selected;
        var index = target ? target.getAttribute(‘selectid‘)-1 : 1;

        this.removeLight();
        index = --index < 0 ? 0 : index;
        this.selected = this.menu.children[index].children[0];
        this.hightLight();
      }

      /**
       *  键盘操作
       * @param {number} code ASSIC码
       */
      Selecter.prototype.keydown = function(code){
        switch(code){
          case 40: //down
            this.next();
            break;
          case 38://up
            this.prev();
            break;
          case 13:
            this.menuUpdate();
            this.menuHide();
            break;
          default:
            break;
        }
      }
//调用
  window.onload=function(){
    var menu = new Selecter(‘divselect‘);
  }

我是以对象的方式进行编写的,这样写的好处有:

1:对于调用者来说,不需要关心下拉框内部的节点和实现逻辑。只要传入一个id就可以了。

2: 整个下拉菜单看成是一个对象,每次对菜单进行什么操作,在对象内部都可以进行存储。避免进行不必要的节点查询操作。

3: 事件邦在根节点上,通过冒泡进行监听,即节省代码又可以有效提高性能。

4:代码按功能进行编写,结构清晰,扩展和维护方便。

以上就是王婆卖瓜,欢迎吐糟。

如果您觉得这文章对您有帮助,请点击【推荐一下】,想跟我一起学习吗?那就【关注】我吧!

时间: 2024-11-05 06:13:55

编程挑战--下拉菜单的相关文章

JavaScript---网络编程(11)--DHTML技术演示(4)-单选框/下拉菜单/添加文件

本节讲述单选框/下拉菜单/添加文件,综合css,html和JavaScript. 单选框: 实现的功能是:(类似平时的性格测试) 先隐藏一部分页面,然后通过点击单选框来显示. 再通过选项的选择-(每个选项有不同的积分)积分的多少来给出评语 演示代码: <html> <head> <title>DHTML技术演示---radio的使用</title> <meta http-equiv="content-Type" content=&q

CSS样式三级下拉菜单

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="

创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件

Bootstrap是当下流行的前端UI组件库之一.利用Bootstrap,可以很方便的构造美观.统一的页面.把设计师从具体的UI编码中解放出来.   Bootstrap提供了不少的前端UI组件.带下拉菜单的文本框就是其中之一,效果图如下(真要自己完全设计,还得费一番功夫)   关于该组件的详情参看Bootstrap官网.带下拉菜单的文本框   看到上面的效果图,使我想到WinForm编程中的DropDownList控件.不过,和DropDownList控件相比,还缺少以下内容 1.当点击菜单中的

HTML+JS+CSS 实现下拉菜单

最近在看视频学习做一些HTML+JS+CSS的实例,第一个是实现下拉菜单. 5.7 制作的思路是:1.静态网页的制作 2.动态特效实现菜单的显示和隐藏(三种方法:css.JavaScript.jQuery) 3.浏览器的兼容问题(低版本IE可能不支持等) 在用css实现时,由于盒子模型有自己默认的margin和padding值,所以要reset. 有一点比较有疑问的实,老师在视频里说position:absolute要和left.top同时使用.这是为什么?在实现的时候,我并没有使用left和t

用HTML和CSS实现的下拉菜单

<!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>用HTML和CSS实现下拉列表</title> <style> /*导航栏的样式*/ *{margin:0;padding:0;} #nav{background-color:#eee;width:500px;height:40px;margin:

boostrapt的二级下拉菜单

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style&qu

Bootstrap下拉菜单

[Bootstrap 下拉菜单] <div class="dropdown"> <button type="button" class="btn dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown">主题 <span class="caret"></span> </but

bootstrap-按钮的向下向上三角形-向上弹起的下拉菜单

1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>按钮的向下向上三角形-向上弹起的下拉菜单</title>     <

bootstrap-导航加下拉菜单(二级导航)

1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>导航加下拉菜单(二级导航)</title>     <!-- 最新版