<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Oo緣來是你oO


    posts - 120,comments - 125,trackbacks - 0

    CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版

    馬嘉楠   2008-12-08

     

    在上一篇《CSS+JavaScript 實(shí)現(xiàn)菜單功能》通過一個(gè)HTML頁(yè)面簡(jiǎn)單的實(shí)現(xiàn)了菜單功能。但是實(shí)際開發(fā)當(dāng)中,如果菜單欄有很多項(xiàng),頻繁的修改HTML,會(huì)很繁瑣,也容易出錯(cuò)。

    改進(jìn)版本優(yōu)化了這個(gè)問題,通過簡(jiǎn)單的Javascript代碼就可以增加菜單。同時(shí)使得HTML頁(yè)面非常簡(jiǎn)潔,只需要寫2行代碼即可!O(∩_∩)O

    1.使用前提,在HTML頁(yè)面中引入一個(gè)CSS文件,和一個(gè)JavaScript文件。如下:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
    <HTML> 
        
    <HEAD> 
            
    <TITLE>Menu</TITLE> 
            
    <link type="text/css" rel="stylesheet" href="menu.css">   
        
    </HEAD> 
        
    <BODY> 
            
    <div><script src="menu.js"></script></div> 
        
    </BODY> 
    </HTML>


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

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

     

    2.定義菜單代碼如下:

    if (document.getElementById)
        
    var root = new Root();   
         
        
    var m1 = new Menu("File","alert(this.innerText);"); 
        root.add(m1); 
        
    var m11 = new MenuItem("New"); 
        m1.add(m11); 
        m1.add(
    new MenuItem("Open","alert('open file');")); 
        
    var m12 = new MenuItem("Save"); 
        m1.add(m12); 
        m1.add(
    new MenuItem("Save As")); 
        m1.add(
    new MenuItem("Close")); 
        m1.add(
    new MenuItem("")); 
         
        
    var m2 = new Menu("Edit"); 
        root.add(m2); 
         
        root.toString();     
    }

     

    說明:

    1) var root = new Root();      

            root.toString();  

            固定格式

    2)聲明菜單:

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

            菜單顯示的名稱為“File”,onclick事件為alert(this.innerText);

            root.add(m1);

            第一級(jí)菜單(即頁(yè)面初始顯示的菜單)放到root之下,通過add()方法

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

            m1.add(m11);

            聲明“File”的子菜單“New”

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

            聲明“File”的子菜單“Open”

    通過上面的代碼即可完成菜單的添加功能。

     

     

    代碼文件:

    <1> menu.cs

    #menubar {  
        font-family
    :verdana;  
        font-size
    :12px;               
        margin
    :1px;  
    }
      
    #menubar li 
    {  
        float
    :left;  
        position
    :relative;                
        text-align
    :left;  
    }
             
    /* each menu item style */  
    #menubar li a 
    {  
        border-style
    :none;  
        color
    :black;  
        display
    :block;                            
        width
    :150px;  
        height
    :20px;  
        line-height
    :20px;  
        padding-left
    :10px;  
        text-decoration
    :none;     
    }
      
    /* the first level menu which displays default */  
    #menubar .menuMain
    {  
        border-color
    :#C0C0C0;  
        border-width
    :1px;  
        border-style
    :solid;  
    }
      
    /* the first leve style when mouse on it */  
    #menubar li a:hover
    {  
        background-color
    :#efefef;   
        text-decoration
    :underline;  
    }
      
    /* the second level menu block style */  
    #menubar li ul
    {  
        background-color
    :#efefef;  
        border-style
    :none;  
        display
    :none;  
        position
    :absolute;  
        top
    :20px;  
        left
    :-40px;  
        margin-top
    :2px;  
        width
    :150px;              
    }
      
    /* the sub menu item style when mouse on it */  
    #menubar li ul li a:hover 
    {  
        text-decoration
    :underline;   
        padding-left
    :20px;   
    }
      
    /* the third or more level menu block style */  
    #menubar li ul li ul 
    {  
        display
    :none;  
        position
    :absolute;  
        top
    :0px;  
        left
    :150px;   
        margin-top
    :0;  
        margin-left
    :0;  
        width
    :150px;  
    }
      


    <2>menu.js

    var MenuConfig = 
        defaultText : 
    "Menu Item"
        defaultAction : 
    "javascript:void(0);"   , 
        defaultMenuCssStyle : 
    "menuMain" 
    }


    var MenuHandler = 
        idCounter : 
    0
        idPrefix : 
    "menu-"
        getId : 
    function()return this.idPrefix + this.idCounter++ ;}
        insertHTMLBeforeEnd : 
    function(node, sHTML)
            
    if(node.insertAdjacentHTML != null)
                node.insertAdjacentHTML('BeforeEnd',sHTML); 
                
    return
            }
     
            
    var df; // DocumentFragment 
            var r = node.ownerDocument.createRange(); 
            r.selectNodeContents(node); 
            r.collapse(
    false); 
            df 
    = r.createContextualFragment(sHTML); 
            node.appendChild(df); 
        }
     
    }
     

    function displaySubMenu(li){  
        
    var subMenu = li.getElementsByTagName('ul')[0];  
        
    if(subMenu) 
            subMenu.style.display 
    = 'block';  
    }
      

    function hideSubMenu(li){  
        
    var subMenu = li.getElementsByTagName('ul')[0];    
        
    if(subMenu) 
            subMenu.style.display 
    = 'none';  
    }
       


    /****************************************** 
     * Funciont Name:   MenuAbstractNode 
     * Description: MenuAbstractNode class 
     * @param {String} pText  
     * @param {String} pAction  
     * @Return: 
     ******************************************
    */
      
    function MenuAbstractNode(pText, pAction)
        
    this.text = pText || MenuConfig.defaultText;     
        
    this.action = pAction || MenuConfig.defaultAction; 
        
    this.id = MenuHandler.getId(); 
         
        
    this.childNodes = []; 
    }
     

    MenuAbstractNode.prototype.add 
    = function(node)
        
    this.childNodes[this.childNodes.length] = node; 
    }
     

    /****************************************** 
     * Funciont Name:   toString 
     * Description: generate HTML code 
     * @param   
     * @param  
     * @Return: 
     ******************************************
    */
     
    MenuAbstractNode.prototype.toString 
    = function(){    
        
    var str = "<li id=\"" + this.id + "\" onmouseover=\"displaySubMenu(this)\" onmouseout=\"hideSubMenu(this)\"><a href=\"#\""

        
    if(this.type=="Menu")
            str 
    = str + " class=\"" + this.cssStyle + "\""
        }
     
        str 
    = str + " onclick=\""+this.action+"\">"+this.text+"</a>"
         
        
    var sb = []; 

        
    for (var i = 0; i < this.childNodes.length; i++
            sb[i] 
    = this.childNodes[i].toString(); 
        }
     
        
    if(sb.length>0)
            str 
    = str + "<ul>" + sb.join(""+ "</ul>" 
        }
     

        
    return str + "</li>" ; 
    }
     

    /****************************************** 
     * Funciont Name:   Menu 
     * Description: Menu class 
     * @param {String} pText  
     * @param {String} pAction  
     * @param {String} pCssStyle  
     * @Return: 
     ******************************************
    */
      
    function Menu(pText, pAction,pCssStyle)
        
    this.base = MenuAbstractNode; 
        
    this.base(pText,pAction); 
         
        
    this.type = "Menu"
        
    this.cssStyle = pCssStyle || MenuConfig.defaultMenuCssStyle; 
    }
     

    Menu.prototype 
    = new MenuAbstractNode; 

    /****************************************** 
     * Funciont Name:   MenuItem 
     * Description: MenuItem class 
     * @param {String} pText  
     * @param {String} pAction  
     * @Return: 
     ******************************************
    */
     
    function MenuItem(pText, pAction)
        
    this.base = MenuAbstractNode; 
        
    this.base(pText,pAction); 
        
    this.type = "MenuItem"
    }
     

    MenuItem.prototype 
    = new MenuAbstractNode; 


    /****************************************** 
     * Funciont Name:   Root 
     * Description: Root class 
     * @Return: 
     ******************************************
    */
     
    function Root()
        
    this.id = "menubar"
        
    this.childNodes=[];  
    }
     

    Root.prototype 
    = new MenuAbstractNode; 

    Root.prototype.toString 
    = function()
        document.write(
    "<div id='menu'><ul id=\""+root.id+"\"> </ul> </div>"); 
        
    for(var i=0; i<this.childNodes.length; i++)
            MenuHandler.insertHTMLBeforeEnd(document.getElementById(root.id), 
    this.childNodes[i].toString()); 
        }
     
    }
     

    if (document.getElementById)
        
    var root = new Root();   
         
        
    var m1 = new Menu("File","alert(this.innerText);"); 
        root.add(m1); 
        
    var m11 = new MenuItem("New","alert(this.innerText);"); 
        m1.add(m11); 
        m1.add(
    new MenuItem("Open","alert('open file');")); 
        
    var m12 = new MenuItem("Save"); 
        m1.add(m12); 
        m1.add(
    new MenuItem("Save As")); 
        m1.add(
    new MenuItem("Close")); 
        m1.add(
    new MenuItem("")); 
         
        
    var m2 = new Menu("Edit"); 
        root.add(m2); 
        
    var m22 = new MenuItem("Select All"); 
        m2.add(m22); 
        m2.add(
    new MenuItem("Cut")); 
        m2.add(
    new MenuItem("Copy")); 
        m2.add(
    new MenuItem("paste")); 
         
        
    var m3 = new Menu("View"); 
        
    var m33 = new MenuItem("View List"); 
        m33.add(
    new MenuItem("Function List")); 
        m3.add(m33); 
        m3.add(
    new MenuItem("Tool Bar")); 
        root.add(m3); 
        root.toString();     
    }
     

     

     



    馬嘉楠
    jianan.ma@gmail.com

    posted on 2008-12-12 20:10 馬嘉楠 閱讀(2434) 評(píng)論(4)  編輯  收藏 所屬分類: SoureCodeJava Script

    FeedBack:
    # re: CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版
    2008-12-12 21:05 | 小人物
    頂了。。。寫的很好。。  回復(fù)  更多評(píng)論
      
    # re: 【原創(chuàng)】CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版[未登錄]
    2008-12-13 11:23 | zxbyh
    為什么不用jquery和pototyle  回復(fù)  更多評(píng)論
      
    # re: 【原創(chuàng)】CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版
    2008-12-13 17:23 | 44you
    這個(gè)是美工的實(shí)現(xiàn),如果你用的框架中,不能用jquery,pototyle,諸如此情況,還是要自己寫,而已,樓主寫得很清晰,就當(dāng)做源碼來看吧~  回復(fù)  更多評(píng)論
      
    # re: 【原創(chuàng)】CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版[未登錄]
    2008-12-15 11:00 | Windy
    好東西 ~  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 免费一级毛片在线播放视频免费观看永久 | 亚洲熟妇少妇任你躁在线观看无码| 亚洲综合国产一区二区三区| 亚洲色av性色在线观无码| 亚洲国产精品无码观看久久| a级精品九九九大片免费看| 成年女性特黄午夜视频免费看| 国产91精品一区二区麻豆亚洲| 亚洲免费观看在线视频| 国产裸体美女永久免费无遮挡| 国产四虎免费精品视频| 亚洲欧洲日产国码高潮αv| 亚洲永久中文字幕在线| a免费毛片在线播放| 成人毛片免费观看| 亚洲av无码一区二区乱子伦as| 久久亚洲精品成人无码| 免费观看无遮挡www的视频| 综合亚洲伊人午夜网| 亚洲人成色在线观看| 大地资源在线资源免费观看| 男女啪啪永久免费观看网站| 久久精品国产亚洲av水果派 | 国产午夜鲁丝片AV无码免费| 久久精品国产亚洲av高清漫画| 特黄aa级毛片免费视频播放| 青青青国产在线观看免费网站| 精品国产亚洲一区二区三区| 羞羞网站免费观看| 99久久综合国产精品免费| 亚洲av福利无码无一区二区| 猫咪免费观看人成网站在线| 成人免费无码大片A毛片抽搐色欲| 亚洲宅男永久在线| 色www永久免费网站| 伊人久久亚洲综合影院| 亚洲日韩国产精品乱-久| 色欲国产麻豆一精品一AV一免费| 久久久久久久亚洲精品| WWW亚洲色大成网络.COM | 亚洲国产精品yw在线观看|