zoukankan      html  css  js  c++  java
  • 读取配置文件生成简单的网站导航菜单

    前段时间,做了个简单的网站,因为时间仓促,那时每个页面都是写一个导航Ul。事完,觉得这维护起来实在太麻烦了,遂决定做个简单的导航脚本,读取Xml文件,动态生成页面菜单,然后根据当前Url自动判别哪个是当前菜单。以后还可以做个配置页面更新Xml文件……远的事情,以后再说,但总得有个考虑哈……

    完成之后,觉得还是不理想啊,因为读取和解析Xml造成时间延迟问题,可以看到页面加载完成后,页面上的导航菜单有个重新加载的过程,郁闷中……

    话不多说,上代码。

    JS:

    $(function () {
        /**
        *Ivan 2013-4-15
        *This menu helper mostly can have two leverls 
        */
        
        var url = document.URL;
        var currentPage;
        var menuTarget = $("#header");//where to display the menu
        var menuConfigUrl = "config/menuConfig.xml";//menu config xml file at server
        currentPage = getPageName(url);
       
        $.ajax({
            url: menuConfigUrl,
            dataType: 'xml',
            success: function (data) {
                getMenuCallback(data);
            }
        });
        
        //Get menu data call back
        function getMenuCallback(data) {
            var menuUl = document.createElement("ul");
            $(data).find("menus").children().each(function (index, ele) {
                var title = $(ele).attr("title");
                var link = $(ele).attr("url");
                
                var menuli = document.createElement("li");
                $(menuli).addClass($(ele).attr("class"));
                if (getPageName(link) == currentPage) {
                   $(menuli).addClass("selected");
                }
    
                $('<a href="' + link + '">' + title + '</a>').appendTo($(menuli));
    
                if ($(ele).children().length > 0) {
                    //The second lever menu
                    var subMenuUl = document.createElement("ul");
                    $(ele).children().each(function (subIndex, subEle) {
                        title = $(subEle).attr("title");
                        link = $(subEle).attr("url");
                        var subMenuli = document.createElement("li");
                        $(subMenuli).addClass($(subEle).attr("class"));
                        $('<a href="' + link + '">' + title + '</a>').appendTo($(subMenuli));
                        $(subMenuUl).append($(subMenuli));
                    });
                    $(menuli).append($(subMenuUl));
                }
                
                $(menuUl).append($(menuli));
    
            });
            
            var menuDiv = document.createElement("div");
            menuDiv.appendChild(menuUl);
            if (menuTarget.length > 0) {
                menuTarget.append($(menuDiv));
            } else {
                $("body").prepend($(menuDiv));
            }
        }
        
        //Get page name from a url string
        function getPageName(urlStr) {
            var pageName;
            if (urlStr.indexOf("?") != -1) {
                pageName = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr.indexOf("?") - 1);
            } else {
                pageName = urlStr.substr(urlStr.lastIndexOf("/") + 1);
            }
            return pageName;
        }
    });

    示例的Xml文件(很多属性备用,尚未具体应用^_^):

    <?xml version="1.0" encoding="utf-8" ?>
    <root>
      <menus>
        <menu title="首页" url="index.html" icon="" privilege="" target="" class=""></menu>
        <menu title="产品浏览" url="product.html" icon="" privilege="" target="" class=""></menu>
        <menu title="公司动态" url="news.html" icon="" privilege="" target="" class=""></menu>
        <menu title="关于我们" url="about.html" icon="" privilege="" target="" class=""></menu>
      </menus>
    </root>

    页面的CSS样式就没放上来,百度or谷歌一下导航菜单样式,一大堆了。这里要有一个selected的class样式,用来标记当前所在菜单。

    Html页面,原文件:

    <div id="header">
            
     </div>
    
     <script src="scripts/Ivan.Main-menu.js"></script>

    动态生成后:

    <div id="header">
      <ul>
        <li><a href="index.html">首页</a></li>
        <li><a href="product.html">产品浏览</a></li>
        <li class="selected">
          <a href="news.html">公司动态</a></li>
        <li><a href="about.html">关于我们</a></li>
      </ul>
    </div> <script src="scripts/Ivan.Main-menu.js"></script>

    当然,这只是页面中的部分代码。

    作者:Ivan
    个人网站:http://www.IvanBy.com
  • 相关阅读:
    这是阿里技术专家对 SRE 和稳定性保障的理解
    阿里四年技术 TL 的得失总结:如何做好技术 Team Leader
    深度 | 阿里云蒋江伟:什么是真正的云原生?
    亲历者说 | 完整记录一年多考拉海购的云原生之路
    Seata RPC 模块的重构之路
    对容器镜像的思考和讨论
    20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测
    怎么提升写代码的能力
    云原生 DevOps 的 5 步升级路径
    dubbo-go 白话文 | 从零搭建 dubbogo 和 dubbo 的简单用例
  • 原文地址:https://www.cnblogs.com/oneivan/p/3022560.html
Copyright © 2011-2022 走看看