读取配置文件生成简单的网站导航菜单

前段时间,做了个简单的网站,因为时间仓促,那时每个页面都是写一个导航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>

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

posted @ 2013-04-15 17:45  One Ivan  阅读(2120)  评论(2编辑  收藏  举报