天天看點

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.     var m1 = new Menu("File","alert(this.innerText);");
  4.     root.add(m1);
  5.     var m11 = new MenuItem("New");
  6.     m1.add(m11);
  7.     m1.add(new MenuItem("Open","alert('open file');"));
  8.     var m12 = new MenuItem("Save");
  9.     m1.add(m12);
  10.     m1.add(new MenuItem("Save As"));
  11.     m1.add(new MenuItem("Close"));
  12.     m1.add(new MenuItem(""));
  13.     var m2 = new Menu("Edit");
  14.     root.add(m2);
  15.     root.toString();    
  16. }

說明:

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. #menubar li a { 
  11.     border-style:none; 
  12.     color:black; 
  13.     display:block;                           
  14.     width:150px; 
  15.     height:20px; 
  16.     line-height:20px; 
  17.     padding-left:10px; 
  18.     text-decoration:none;    
  19. #menubar .menuMain{ 
  20.     border-color:#C0C0C0; 
  21.     border-width:1px; 
  22.     border-style:solid; 
  23. #menubar li a:hover{ 
  24.     background-color:#efefef;  
  25.     text-decoration:underline; 
  26. #menubar li ul{ 
  27.     background-color:#efefef; 
  28.     border-style:none; 
  29.     display:none; 
  30.     position:absolute; 
  31.     top:20px; 
  32.     left:-40px; 
  33.     margin-top:2px; 
  34.     width:150px;             
  35. #menubar li ul li a:hover { 
  36.     text-decoration:underline;  
  37.     padding-left:20px;  
  38. #menubar li ul li ul { 
  39.     display:none; 
  40.     position:absolute; 
  41.     top:0px; 
  42.     left:150px;  
  43.     margin-top:0; 
  44.     margin-left:0; 
  45.     width:150px; 
  46. }  

<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. function MenuAbstractNode(pText, pAction){
  33.     this.text = pText || MenuConfig.defaultText;    
  34.     this.action = pAction || MenuConfig.defaultAction;
  35.     this.id = MenuHandler.getId();
  36.     this.childNodes = [];
  37. }
  38. MenuAbstractNode.prototype.add = function(node){
  39.     this.childNodes[this.childNodes.length] = node;
  40. }
  41. MenuAbstractNode.prototype.toString = function(){   
  42.     var str = "<li id=/"" + this.id + "/" οnmοuseοver=/"displaySubMenu(this)/" οnmοuseοut=/"hideSubMenu(this)/"><a href=/"#/"";
  43.     if(this.type=="Menu"){
  44.         str = str + " class=/"" + this.cssStyle + "/"";
  45.     }
  46.     str = str + " οnclick=/""+this.action+"/">"+this.text+"</a>";
  47.     var sb = [];
  48.     for (var i = 0; i < this.childNodes.length; i++) {
  49.         sb[i] = this.childNodes[i].toString();
  50.     }
  51.     if(sb.length>0){
  52.         str = str + "<ul>" + sb.join("") + "</ul>"
  53.     }
  54.     return str + "</li>" ;
  55. }
  56. function Menu(pText, pAction,pCssStyle){
  57.     this.base = MenuAbstractNode;
  58.     this.base(pText,pAction);
  59.     this.type = "Menu";
  60.     this.cssStyle = pCssStyle || MenuConfig.defaultMenuCssStyle;
  61. }
  62. Menu.prototype = new MenuAbstractNode;
  63. function MenuItem(pText, pAction){
  64.     this.base = MenuAbstractNode;
  65.     this.base(pText,pAction);
  66.     this.type = "MenuItem";
  67. }
  68. MenuItem.prototype = new MenuAbstractNode;
  69. function Root(){
  70.     this.id = "menubar";
  71.     this.childNodes=[]; 
  72. }
  73. Root.prototype = new MenuAbstractNode;
  74. Root.prototype.toString = function(){
  75.     document.write("<div id='menu'><ul id=/""+root.id+"/"> </ul> </div>");
  76.     for(var i=0; i<this.childNodes.length; i++){
  77.         MenuHandler.insertHTMLBeforeEnd(document.getElementById(root.id), this.childNodes[i].toString());
  78.     }
  79. }
  80. if (document.getElementById){
  81.     var root = new Root();  
  82.     var m1 = new Menu("File","alert(this.innerText);");
  83.     root.add(m1);
  84.     var m11 = new MenuItem("New","alert(this.innerText);");
  85.     m1.add(m11);
  86.     m1.add(new MenuItem("Open","alert('open file');"));
  87.     var m12 = new MenuItem("Save");
  88.     m1.add(m12);
  89.     m1.add(new MenuItem("Save As"));
  90.     m1.add(new MenuItem("Close"));
  91.     m1.add(new MenuItem(""));
  92.     var m2 = new Menu("Edit");
  93.     root.add(m2);
  94.     var m22 = new MenuItem("Select All");
  95.     m2.add(m22);
  96.     m2.add(new MenuItem("Cut"));
  97.     m2.add(new MenuItem("Copy"));
  98.     m2.add(new MenuItem("paste"));
  99.     var m3 = new Menu("View");
  100.     var m33 = new MenuItem("View List");
  101.     m33.add(new MenuItem("Function List"));
  102.     m3.add(m33);
  103.     m3.add(new MenuItem("Tool Bar"));
  104.     root.add(m3);
  105.     root.toString();    
  106. }

繼續閱讀