• 熬夜写的无限级标准JS树状导航菜单 !


    catge在2009年12月27日 更新 “关于树状菜单的新想法,希望对前端新人有帮助

        这几天做HUB系统模板都要做到精神崩溃了,已经连续工作了48+小时,这期间遇到了不少问题,有js的,也有css的,全都一个个的自行解决。感觉自己有点事必躬亲,太过于追求完美了。做的东西不少,截取其中我认为有价值的贴出来给大家共享,今天就先谈谈树状导航菜单。

        网上流行一种说法:“不会用JS写树状菜单,就不算真正懂JS”。先贴出我的菜单源码,再谈设计思路和使用方法,如果有什么BUG希望能帮忙指出

    —————————————————

    <html>
    <head>
    </head>
    <body>
    <ul id=”side_menu”>
    <li><a href=”#”>[-] 一级菜单</a>
    <ul>
    <li><a href=”#”>[-] 二级菜单</a>
    <ul>
    <li><a href=”#”>[-] 三级菜单</a></li>
    <li><a href=”#”>[-] 三级菜单</a></li>
    </ul>
    </li>
    <li><a href=”#”>[-] 二级菜单</a></li>
    </ul>
    </li>
    </ul>
    <body>
    <script type=”text/javascript”>
    /*=======================树状菜单开始====================*/
    //该树状菜单由catge原创,有任何疑问和BUG请联系QQ:965496 Blog:catge.blogbus.com
    //该菜单支持无限级数,增加级数方法:三级时level赋值5,以后每增加一级level值增2
    //该例CSS样式表已经定义到5级样式,
    //套用该函数只需在树状菜单根节点上使用id=”side_menu”,列表需使用UL
    /*===================================================*/
    var level = 5;
    var n = level;
    
    //判断该对象是否包含于side_menu中
    function isInSideMenu(obj){
    if(n){ n–;
    if(obj.getAttribute&&obj.getAttribute(“id”)==”side_menu”){n = level;return true;}
    if(obj.nodeType==9){n = level;return false;}//超过当前文档树结构时返回false
    else{return isInSideMenu(obj.parentNode);}
    }
    n = level;
    return false;
    }
    //菜单折叠效果函数
    function foldMenu(){
    if(this.nextSibling&&this.nextSibling.nextSibling){
    if(this.nextSibling.nextSibling.style.display==”block”){
    this.nextSibling.nextSibling.style.display =”none”;
    this.innerHTML = this.innerHTML.replace(“-”,”+”);
    }else{
    this.nextSibling.nextSibling.style.display =”block”;
    this.innerHTML = this.innerHTML.replace(“+”,”-”);
    }
    }else{
    this.innerHTML = this.innerHTML.replace(“+”,”-”);
    } 
    }
    //初始化树状菜单
    function intSideMenu(){
    var as = document.getElementsByTagName(“a”);
    var uls = document.getElementsByTagName(“ul”);
    var sidemenuUL = document.getElementById(“side_menu”);
    for(var i=0;i<as.length;i++){
    if(isInSideMenu(as[i])){
    as[i].onclick= foldMenu;
    as[i].innerHTML = as[i].innerHTML.replace(“-”,”+”);
    }
    }//给所有树状菜单内的a绑定foldMenu函数 
    for(var j=0;j<uls.length;j++){
    if(isInSideMenu(uls[j]))uls[j].style.display =”none”;//初始化隐藏树状菜单
    }
    sidemenuUL.style.display = “block”;//显示根菜单 
    }
    
    intSideMenu();
    /*====================//树状菜单结束==========================*/
    </script>
    </html>

    —————————————————–

    使用方法基本上注释里都有了,再按个人喜好给适当的ul li添加class定义css样式就行了。下面主要说下设计的思路:

    1、保证用户在禁用JS时也能正常显示改菜单,所以使用的是标准的UL和DOM,已经通过测试的有IE7和FIREFOX,其他浏览器不知道。

    2、intSideMenu();进行一个菜单初始化的行为。给ul id=”side_menu”里的A绑定onclick事件,同时把从最外层的挂钩UL到最里层的UL隐藏,并将[-]改成[+]做成树状效果。

    3、isInSideMenu()函数判断传入的对象是否为ul id=”side_menu”包含的元素,通过这个函数过滤掉外面的干扰UL和A,这个函数很短,但很巧妙,感觉像是自己偶然的收获

    4、foldMenu()函数对前面绑定了onclick的a进行不同的效果呈现,前面几个if就是用来区分不同的A。该函数比较依赖页面结构,所以如果要改进,这个函数应该改的比较多,不过现在看来这种效果已经足够。

    PS:统一回复下问“背景音乐”类问题的朋友,过些天不忙了我会专门写个该类问题的汇总日志,看能不能也自己写个音乐播放器方便大家用。

  • 相关阅读:
    后端程序员必备的 Linux 基础知识+常见命令(近万字总结)
    信息收集流程
    在不影响程序使用的情况下添加shellcode
    使用Zolom内存解析运行python脚本(不落地)
    要点3:输入函数对比与自定义输入方式
    要点2:循环、条件控制
    对等连接和云联网
    上传自定义镜像到腾讯云
    Windows 激活
    MySQL错误(报错)一览表(对照表)
  • 原文地址:https://www.cnblogs.com/kaiye/p/3039067.html
Copyright © 2020-2023  润新知