动态获取导航栏

这里记录的是两层的导航栏。首先数据库中建两张表,一张存储父节点数据,另一张存储子节点数据,结构如下

父表:

子表:

这里有两种方式实现导航栏。第一种,通过两个Repeater循环得到并展示导航栏。第二种,通过拼json方式传给前台,前台动态拼html得到导航栏。

首先记录第一种方法:

  protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Repeater1.DataSource = getfather();
                Repeater1.DataBind();

            }
        }

        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            RepeaterItem item = e.Item;
            DataRowView drv = (DataRowView)item.DataItem;
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater rpt = (Repeater)item.FindControl("rep");
                string categoryId = Convert.ToString(drv.Row["CategoryNumber"]);
                if (categoryId != null)
                {
                    rpt.DataSource = getson(categoryId);
                    rpt.DataBind();

                }
            }
        }

        private DataTable getfather()
        {
            string sql = "select * from T_ClothCategory";
            return SqlHelper.ExecuteDataTable(sql);
        }

        private DataTable getson(string id)
        {
            string sql = "select * from T_Clothes where categoryId=" + id;
            return SqlHelper.ExecuteDataTable(sql);

        }

此方法通过后台取得数据,在Repeater1_ItemDataBound绑定项中给repeater填加数据
前台

    <script>
        $(function () {

            $(".level1 > a").click(function () {
                //$(this).addClass("current")   //给当前元素添加"current"样式
                //.next().show(500)                //下一个元素显示
                //.parent().siblings().children("a").removeClass("current")        //父元素的兄弟元素的子元素<a>移除"current"样式
                //.next().hide(500);                //它们的下一个元素隐藏
                //return false;

                $(this).addClass("current")
                .next().toggle(500)
                .parent().siblings().children("a").removeClass("current")
                .next().hide(500);
                return false;

            });
        })
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <div class="box">
                <ul class="menu">
                    <asp:Repeater ID="Repeater1" runat="server"
                        OnItemDataBound="Repeater1_ItemDataBound">
                        <ItemTemplate>
                            <li class=‘level1‘><a href=‘#‘><%#Eval("CategoryName") %></a>
                                <ul class=‘level2‘>
                                    <asp:Repeater ID="rep" runat="server">
                                        <ItemTemplate>
                                            <li><a href=‘<%# Eval("url") %>‘><%#Eval("Name")%></a>
                                        </ItemTemplate>
                                    </asp:Repeater>
                                </ul>
                            </li>
                        </ItemTemplate>
                    </asp:Repeater>

                </ul>
            </div>
        </div>
    </form>
</body>
</html>

第二种方法:

在html中dom元素加载完执行异步方法,到一般处理程序中得到数据
一般处理程序:

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";     

            string data = "select * from  dbo.T_ClothCategory";
            DataTable dtFather = SqlHelper.ExecuteDataTable(data);

            string json= convert(dtFather);

            context.Response.Write(json);
        }

        public string convert(DataTable dt)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("{\"dongdong\":[");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                sb.Append("{");
                sb.Append("\"categoryName\":" +"\""+dt.Rows[i]["CategoryName"] +"\""+ ",");
                sb.Append("\"son\":[");
                int categoryNumber = Convert.ToInt32(dt.Rows[i]["CategoryNumber"]);
                DataTable dtSon = SqlHelper.ExecuteDataTable("select * from dbo.T_Clothes where categoryId=" + categoryNumber);
                for (int j = 0; j < dtSon.Rows.Count; j++)
                {
                    sb.Append("{");
                    sb.Append("\"Name\":" +"\""+dtSon.Rows[j]["Name"]+"\""+",");
                    sb.Append("\"url\":" +"\""+ dtSon.Rows[j]["url"].ToString().Trim()+"\"");
                    sb.Append("},");
                }
                sb.Remove(sb.ToString().LastIndexOf(‘,‘), 1);
                sb.Append("]},");

            }
            sb.Remove(sb.ToString().LastIndexOf(‘,‘), 1);
            sb.Append("]}");
            return sb.ToString();
        }

前台页面拼html

    <script>
        $(function () {
            var $load = $("#loading"); 

            ////首先生成列表
            $.ajax({
                url: "GetClothes.ashx",
                type: "post",
                dataType: "json",
                beforeSend: function () {
                    $load.show();
                },
                complete: function (xhr) {
                    $load.hide();
                },
                success: function (returnData) {
                    Create(returnData.dongdong);
                }
            })

            $(document).delegate(".level1", "click", function () {
                //alert($(this).children().html());
                $(this).children("a").addClass("current")
                   .next().toggle(500)
                   .parent().siblings().children("a").removeClass("current")
                   .next().hide(500);
            })

            function Create(returnData) {
                var $ul = $("ul.menu");
                $.each(returnData, function (index, result) {
                    var li = "<li class=‘level1‘><a href=‘#‘>" + result.categoryName + "</a><ul class=‘level2‘></ul></li>";
                    $ul.append(li);
                    var $sonUl = $("ul.menu > li").eq(index).find("ul");
                    $.each(result.son, function (i, data) {
                        $sonUl.append("<li><a href=‘"+data.url+"‘>" + data.Name + "</a></li>");
                    })
                    console.log($ul.html());
                })
            }
        })
    </script>
</head>
<body>
    <div class="box">
        <ul class="menu"></ul>
    </div>
    <div id="loading">加载中……</div>
</body>
</html>

其中遇到的问题是,动态生成的dom元素,点击事件没有效果,网上查资料中称,要在on或者delegate事件中写方法,才会触发新生成的html的事件效果。
用到的前台css样式:

/* reset */
body{margin:0;padding:0 0 12px 0;font-size:12px;line-height:22px;font-family:"\5b8b\4f53","Arial Narrow";background:#fff;}
form,ul,li,p,h1,h2,h3,h4,h5,h6{margin:0;padding:0;}
input,select{font-size:12px;line-height:16px;}
img{border:0;}
ul,li{list-style-type:none;}
a {color:#00007F;text-decoration:none;}
a:hover {color:#bd0a01;text-decoration:underline;}

.box {
    width: 150px;
    margin: 0 auto;
}
.menu{
    overflow:hidden;
    border-color: #C4D5DF;
    border-style: solid;
    border-width: 0 1px 1px;
}
/* lv1 */
.menu li.level1 a{
    display: block;
    height: 28px;
    line-height: 28px;
    background:#EBF3F8;
    font-weight:700;
    color: #5893B7;
    text-indent: 14px;
    border-top: 1px solid #C4D5DF;
}
.menu li.level1 a:hover{text-decoration:none;}
.menu li.level1 a.current{background:#B1D7EF;}
/* lv2 */
.menu li ul{overflow:hidden;}
.menu li ul.level2{display:none;}
.menu li ul.level2 li a{
    display: block;
    height: 28px;
    line-height: 28px;
    background:#ffffff;
    font-weight:400;
    color: #42556B;
    text-indent: 18px;
    border-top: 0px solid #ffffff;
    overflow: hidden;
}
.menu li ul.level2 li a:hover{
    color:#f60;
}

整个页面的CSS

最终效果如下

时间: 2024-10-05 05:19:54

动态获取导航栏的相关文章

ios 获取导航栏和状态栏高度,针对iPhoneX

因为iPhoneX的产生,原本的导航栏再也不是44了,那么会出现什么问题呢?在隐藏导航栏的页面,原本的高度要向上调整一个导航栏+状态栏的高度.那么iPhoneX的导航栏高度不是44了,我们需要手动获取, 有导航栏的,代码如下: 1 2 3 4 5 6 //获取状态栏的rect CGRect statusRect = [[UIApplication sharedApplication] statusBarFrame]; //获取导航栏的rect CGRect navRect = self.navi

【iOS开发-22】navigationBar导航栏,navigationItem建立:获取导航栏中的基本文本和button以及各种跳跃

(1)navigationBar导航栏可以被看作是self.navigationController一个属性导航控制器,它可以由点直接表示self.navigationController.navigationBar.当然navigationBar他还是很物业.让我们风格barStyle.背景backgroundColor.frame属性(能够获取宽高这些信息).还能够用setBackgroundImage方法设置背景图片.当然图片多了能够使用clipsToBounds剪裁. (2)但.navi

动态 改变导航栏透明度

#pragma mark - 实现代理方法  UINavigationBarDelegate 改变导航栏的颜色等功能 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { self.navigationController.naviga

iOS 获取导航栏和状态栏的高度

CGRect rect = [[UIApplication sharedApplication] statusBarFrame]; 状态栏的高度: float status height =  rect.size.height; 导航栏的高度: float navigationheight = self.navigationController.navigationBar.frame.size.height;

一个动态小导航栏(好看的,用C3)(不依赖js,点击小图切换大的背景图)

<!DOCTYPE HTML><htmllang="en-US">    <head>        <meta charset="UTF-8">     <title>CSS3 Full Background Slider </title>        <style type="text/css">            @importurl("ht

改良版 导航栏自动跟随

css部分: .container { /*最外层div定宽*/ position: relative; width: 15rem; height: 1rem; margin-top: 20rem; } .con { /*第二层div,设置溢出为滚动条*/ overflow-x: scroll; overflow-y: hidden; height: 1rem; font-size: 0.4rem; width: 15rem; position: absolute; top: 0; } .nav

设置状态栏和导航栏

// 初始化导航栏外观效果 - (void)initialNavigationBarStyle { // 1. 获取导航栏的外观代理对象 UINavigationBar *navBar = [UINavigationBar appearance]; // 2. 设置背景图片 [navBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault]; /** UIBarMe

Android--&gt;状态栏高度,导航栏高度,Window高度,DecorView高度,heightPixels

喔-这标题,吓我一跳; 请稍等-. 思绪整理中- Android中, 经常被这些高度绊脚. 完全进入懵逼的状态, 有木有? 请允许我,介绍清楚! 通常情况下, 宽度都是很友好的,但是高度就呵呵, 所以本文只介绍高度的计算. 1:DecorView的高度 DecorView的高度代表的是: 整个装饰窗口的高度, 这个高度包括:状态烂的高度和导航栏的高度.(状态栏和导航栏通常叫做装饰窗口, 而ActionBar不属于装饰窗口) 这个高度, 可以代表着整个玻璃屏幕的高度. 2.Window的RootV

iOS开发UINavigation系列一——导航栏UINavigtionBar

iOS开发UINavigation系列一--导航栏UINavigtionBar 一.导航栏的使用 在iOS开发中,我们通常会使用导航控制器,导航控制器中封装了一个UINavigationBar,实际上,我们也可以在不使用导航控制器的前提下,单独使用导航栏,在UINavigationBar中,也有许多我们可以定制的属性,用起来十分方便. 二.UINavigationBar的创建和风格类型 导航栏继承于UIView,所以我们可以像创建普通视图那样创建导航栏,比如我们创建一个高度为80的导航栏,将其放