CSS+JavaScript 实现菜单功能--改进版

CSS+JavaScript 实现菜单功能--改进版

马嘉楠   2008-12-08

共同学习,欢迎转载。转载请注明地址【http://blog.csdn.net/majianan/archive/2008/12/08/3477388.aspx】,谢谢!

 

在上一篇《CSS+JavaScript 实现菜单功能》通过一个HTML页面简单的实现了菜单功能。但是实际开发当中,如果菜单栏有很多项,频繁的修改HTML,会很繁琐,也容易出错。

改进版本优化了这个问题,通过简单的Javascript代码就可以增加菜单。同时使得HTML页面非常简洁,只需要写2行代码即可!O(∩_∩)O

1.使用前提,在HTML页面中引入一个CSS文件,和一个JavaScript文件。如下:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3.     <HEAD>
  4.         <TITLE>Menu</TITLE>
  5.         <link type="text/css" rel="stylesheet" href="menu.css">  
  6.     </HEAD>
  7.     <BODY>
  8.         <div><script src="menu.js"></script></div>
  9.     </BODY>
  10. </HTML>

引入CSS文件:<link type="text/css" rel="stylesheet" href="menu.css">  ,menu.css代码见后

引入JavaScript文件:<script src="menu.js"></script>

 

2.定义菜单代码如下:

  1. if (document.getElementById){
  2.     var root = new Root();  
  3.     
  4.     var m1 = new Menu("File","alert(this.innerText);");
  5.     root.add(m1);
  6.     var m11 = new MenuItem("New");
  7.     m1.add(m11);
  8.     m1.add(new MenuItem("Open","alert('open file');"));
  9.     var m12 = new MenuItem("Save");
  10.     m1.add(m12);
  11.     m1.add(new MenuItem("Save As"));
  12.     m1.add(new MenuItem("Close"));
  13.     m1.add(new MenuItem(""));
  14.     
  15.     var m2 = new Menu("Edit");
  16.     root.add(m2);
  17.     
  18.     root.toString();    
  19. }

说明:

1) var root = new Root();      

        root.toString();  

        固定格式

2)声明菜单:

        var m1 = new Menu("File","alert(this.innerText);");

        菜单显示的名称为“File”,onclick事件为alert(this.innerText);

        root.add(m1);

        第一级菜单(即页面初始显示的菜单)放到root之下,通过add()方法

        var m11 = new MenuItem("New"");

        m1.add(m11);

        声明“File”的子菜单“New”

        m1.add(new MenuItem("Open","alert('open file');"));

        声明“File”的子菜单“Open”

通过上面的代码即可完成菜单的添加功能。

 

 

代码文件:

<1> menu.css

  1. #menubar { 
  2.     font-family:verdana
  3.     font-size:12px;              
  4.     margin:1px
  5. #menubar li { 
  6.     float:left
  7.     position:relative;               
  8.     text-align:left
  9. }        
  10. /* each menu item style */ 
  11. #menubar li a { 
  12.     border-style:none
  13.     color:black
  14.     display:block;                           
  15.     width:150px
  16.     height:20px
  17.     line-height:20px
  18.     padding-left:10px
  19.     text-decoration:none;    
  20. /* the first level menu which displays default */ 
  21. #menubar .menuMain{ 
  22.     border-color:#C0C0C0
  23.     border-width:1px
  24.     border-style:solid
  25. /* the first leve style when mouse on it */ 
  26. #menubar li a:hover{ 
  27.     background-color:#efefef;  
  28.     text-decoration:underline
  29. /* the second level menu block style */ 
  30. #menubar li ul{ 
  31.     background-color:#efefef
  32.     border-style:none
  33.     display:none
  34.     position:absolute
  35.     top:20px
  36.     left:-40px
  37.     margin-top:2px
  38.     width:150px;             
  39. /* the sub menu item style when mouse on it */ 
  40. #menubar li ul li a:hover { 
  41.     text-decoration:underline;  
  42.     padding-left:20px;  
  43. /* the third or more level menu block style */ 
  44. #menubar li ul li ul { 
  45.     display:none
  46.     position:absolute
  47.     top:0px
  48.     left:150px;  
  49.     margin-top:0
  50.     margin-left:0
  51.     width:150px
  52. }  

<2>menu.js

  1. var MenuConfig = {
  2.     defaultText : "Menu Item",
  3.     defaultAction : "javascript:void(0);"   ,
  4.     defaultMenuCssStyle : "menuMain"
  5. };
  6. var MenuHandler = {
  7.     idCounter : 0,
  8.     idPrefix : "menu-",
  9.     getId : function(){ return this.idPrefix + this.idCounter++ ;},
  10.     insertHTMLBeforeEnd : function(node, sHTML){
  11.         if(node.insertAdjacentHTML != null){
  12.             node.insertAdjacentHTML('BeforeEnd',sHTML);
  13.             return;
  14.         }
  15.         var df; // DocumentFragment
  16.         var r = node.ownerDocument.createRange();
  17.         r.selectNodeContents(node);
  18.         r.collapse(false);
  19.         df = r.createContextualFragment(sHTML);
  20.         node.appendChild(df);
  21.     }
  22. }
  23. function displaySubMenu(li){ 
  24.     var subMenu = li.getElementsByTagName('ul')[0]; 
  25.     if(subMenu)
  26.         subMenu.style.display = 'block'
  27. function hideSubMenu(li){ 
  28.     var subMenu = li.getElementsByTagName('ul')[0];   
  29.     if(subMenu)
  30.         subMenu.style.display = 'none'
  31. }  
  32. /******************************************
  33.  * Funciont Name:   MenuAbstractNode
  34.  * Description: MenuAbstractNode class
  35.  * @param {String} pText 
  36.  * @param {String} pAction 
  37.  * @Return:
  38.  *******************************************/ 
  39. function MenuAbstractNode(pText, pAction){
  40.     this.text = pText || MenuConfig.defaultText;    
  41.     this.action = pAction || MenuConfig.defaultAction;
  42.     this.id = MenuHandler.getId();
  43.     
  44.     this.childNodes = [];
  45. }
  46. MenuAbstractNode.prototype.add = function(node){
  47.     this.childNodes[this.childNodes.length] = node;
  48. }
  49. /******************************************
  50.  * Funciont Name:   toString
  51.  * Description: generate HTML code
  52.  * @param  
  53.  * @param 
  54.  * @Return:
  55.  *******************************************/
  56. MenuAbstractNode.prototype.toString = function(){   
  57.     var str = "<li id=/"" + this.id + "/" οnmοuseοver=/"displaySubMenu(this)/" οnmοuseοut=/"hideSubMenu(this)/"><a href=/"#/"";
  58.     if(this.type=="Menu"){
  59.         str = str + " class=/"" + this.cssStyle + "/"";
  60.     }
  61.     str = str + " οnclick=/""+this.action+"/">"+this.text+"</a>";
  62.     
  63.     var sb = [];
  64.     for (var i = 0; i < this.childNodes.length; i++) {
  65.         sb[i] = this.childNodes[i].toString();
  66.     }
  67.     if(sb.length>0){
  68.         str = str + "<ul>" + sb.join("") + "</ul>"
  69.     }
  70.     return str + "</li>" ;
  71. }
  72. /******************************************
  73.  * Funciont Name:   Menu
  74.  * Description: Menu class
  75.  * @param {String} pText 
  76.  * @param {String} pAction 
  77.  * @param {String} pCssStyle 
  78.  * @Return:
  79.  *******************************************/ 
  80. function Menu(pText, pAction,pCssStyle){
  81.     this.base = MenuAbstractNode;
  82.     this.base(pText,pAction);
  83.     
  84.     this.type = "Menu";
  85.     this.cssStyle = pCssStyle || MenuConfig.defaultMenuCssStyle;
  86. }
  87. Menu.prototype = new MenuAbstractNode;
  88. /******************************************
  89.  * Funciont Name:   MenuItem
  90.  * Description: MenuItem class
  91.  * @param {String} pText 
  92.  * @param {String} pAction 
  93.  * @Return:
  94.  *******************************************/
  95. function MenuItem(pText, pAction){
  96.     this.base = MenuAbstractNode;
  97.     this.base(pText,pAction);
  98.     this.type = "MenuItem";
  99. }
  100. MenuItem.prototype = new MenuAbstractNode;
  101. /******************************************
  102.  * Funciont Name:   Root
  103.  * Description: Root class
  104.  * @Return:
  105.  *******************************************/
  106. function Root(){
  107.     this.id = "menubar";
  108.     this.childNodes=[]; 
  109. }
  110. Root.prototype = new MenuAbstractNode;
  111. Root.prototype.toString = function(){
  112.     document.write("<div id='menu'><ul id=/""+root.id+"/"> </ul> </div>");
  113.     for(var i=0; i<this.childNodes.length; i++){
  114.         MenuHandler.insertHTMLBeforeEnd(document.getElementById(root.id), this.childNodes[i].toString());
  115.     }
  116. }
  117. if (document.getElementById){
  118.     var root = new Root();  
  119.     
  120.     var m1 = new Menu("File","alert(this.innerText);");
  121.     root.add(m1);
  122.     var m11 = new MenuItem("New","alert(this.innerText);");
  123.     m1.add(m11);
  124.     m1.add(new MenuItem("Open","alert('open file');"));
  125.     var m12 = new MenuItem("Save");
  126.     m1.add(m12);
  127.     m1.add(new MenuItem("Save As"));
  128.     m1.add(new MenuItem("Close"));
  129.     m1.add(new MenuItem(""));
  130.     
  131.     var m2 = new Menu("Edit");
  132.     root.add(m2);
  133.     var m22 = new MenuItem("Select All");
  134.     m2.add(m22);
  135.     m2.add(new MenuItem("Cut"));
  136.     m2.add(new MenuItem("Copy"));
  137.     m2.add(new MenuItem("paste"));
  138.     
  139.     var m3 = new Menu("View");
  140.     var m33 = new MenuItem("View List");
  141.     m33.add(new MenuItem("Function List"));
  142.     m3.add(m33);
  143.     m3.add(new MenuItem("Tool Bar"));
  144.     root.add(m3);
  145.     root.toString();    
  146. }

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值