jquery ui中 accordion的问题及我的解决方法

时间:2022-12-01 14:57:56

jquery有一套所谓的ui组件,很不错的。如果有兴趣的朋友,可以参考http://jqueryui.com/

但其中的accordion,我使用的时候发现一些问题。如果按照demo那样,写一些静态内容,倒也正常。但如果每个面板里面的内容是动态绑定的,则会发生高度变小,然后出现滚动条的诡异现象

 

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Linq" %>
<%@ Import Namespace="System.Xml.Linq" %>

<script runat="server">
    protected override void OnPreInit(EventArgs e)
    {
        rp.ItemDataBound += new RepeaterItemEventHandler(rp_ItemDataBound);
    }

    void rp_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        Label lb = e.Item.FindControl("categoryId") as Label;
        if (lb != null)
        {
            string id = lb.Text;
            var forms = from x in config.Root.Descendants("Form")
                        where x.Attribute("CategoryId").Value == id
                        select new
                        {
                            FormTitle = x.Attribute("Title").Value,
                            FormDescription = x.Attribute("Description").Value,
                            Url = x.Attribute("Url").Value,
                            Icon = "Forms/Icons/" + x.Attribute("Icon").Value
                        };

            Repeater temp = e.Item.FindControl("rp_forms") as Repeater;
            temp.DataSource = forms;
            temp.DataBind();

        }
    }

    protected override void OnLoad(EventArgs e)
    {
        if (!IsPostBack)
            DataBind();

    }

    private XDocument config = null;

    public override void DataBind()
    {
        //先读取分类数据
        config = XDocument.Load(Server.MapPath("Forms/Forms.xml"));
        var categories = from x in config.Root.Descendants("Category")
                         orderby x.Attribute("Id").Value
                         select new
                         {
                             Title = x.Attribute("Title").Value,
                             Id = x.Attribute("Id").Value,
                             Description = x.Attribute("Description").Value
                         };
        rp.DataSource = categories;
        rp.DataBind();


    }
    
    
    
</script>

<html>
<head runat="server">

    <script src="jquery-1.3.2-vsdoc.js" type="text/javascript"></script>

    <script src="ui/ui.core.js" type="text/javascript"></script>

    <script src="ui/ui.accordion.js" type="text/javascript"></script>

    <link href="themes/cupertino/ui.all.css" rel="stylesheet" type="text/css" />

    <script type="text/javascript">
        $(function() {


            $("#formscontainer").accordion();

        });
    </script>

    <style type="text/css">
        li.formli
        {
            list-style-type: none;
            width: 300px;
            float: left;
        }
        li.formli img
        {
            border: none;
        }
    </style>
</head>
<body>
    <h2>
        表单中心</h2>
    <p>
        这里将列出了所有的表单,您可以通过这里进行表单填写</p>
    <div id="formscontainer">
        <asp:Repeater ID="rp" runat="server">
            <ItemTemplate>
                <h3>
                    <a href="#" title='<%# Eval("Description") %>'>
                        <%# Eval("Title") %></a>
                    <asp:Label ID="categoryId" runat="server" Text='<%# Eval("Id") %>' Visible="false"></asp:Label>
                </h3>
                <div class="details">
                    <asp:Repeater ID="rp_forms" runat="server">
                        <HeaderTemplate>
                            <ul>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <li class="formli">
                                <img src='<%# Eval("Icon") %>' />
                                <a href='<%# Eval("Url") %>'>
                                    <%# Eval("FormTitle") %>
                                </a>
                                <div style="padding-left: 40px">
                                    <%# Eval("FormDescription") %>
                                </div>
                            </li>
                        </ItemTemplate>
                        <FooterTemplate>
                            </ul></FooterTemplate>
                    </asp:Repeater>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </div>
</body>
</html>
开始的时候,看起来不错

jquery ui中 accordion的问题及我的解决方法

但只要缩放几次,就会出现下面这样的情况

jquery ui中 accordion的问题及我的解决方法

发现了吗,div的高度会缩小,然后出现滚动条。而且更加神奇的是,它会逐渐变小,小到一定程度之后,又会还原。

 

尝试过他所有的参数,也没有找到很好的方法,实在也是不解,难道这么明显的问题别人就没有遇到过。

 

我的解决方法倒也干脆,既然不好用,那就自己动手写一个,其实也没有什么大不了的。当然,我写的这个和accordion不完全一样,但更符合我自己的需要,而且简便易行

 

脚本代码

/// 这个脚本用来处理所有的widget行为。
/// 作者:陈希章

$(function() {

    $("div.widget").each(function() {
        var w = $(this);
        var d = w.find("div.details");
        var h = parseInt(d.attr("offsetHeight")) + 10;
        d.css("height", h);

        var autoOpen = w.attr("autoOpen");
        if (autoOpen != null && autoOpen == "false") {
            d.fadeOut("fast");
            //只有明确地设置了不自动打开,才隐藏起来
        }
        else {
            //如果设置了一个action,表示要异步加载        
            var a = d.attr("action");
            if (a != null) {
                d.empty();
                $("<img src='images/loading.gif' />").appendTo(d);
                d.load(a);
            }
        }
    });


    $("div.widget>div.title").click(function() {
        var t = $(this);
        var d = t.next("div.details");
        t.children(".icon").toggleClass("icon2");

        var display = d.css("display");
        if (display == "none") {
            d.fadeIn("slow", function() {
                var a = d.attr("action");
                if (a != null) {
                    d.empty();
                    $("<img src='images/loading.gif' />").appendTo(d);
                    d.load(a);
                }
            });
        }
        else
            d.fadeOut("fast");

    });
});
 
 
页面代码
<%@ Page Language="C#" %>

<%@ Import Namespace="System.Linq" %>
<%@ Import Namespace="System.Xml.Linq" %>

<script runat="server">
    protected override void OnPreInit(EventArgs e)
    {
        rp.ItemDataBound += new RepeaterItemEventHandler(rp_ItemDataBound);
    }

    void rp_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        Label lb = e.Item.FindControl("categoryId") as Label;
        if (lb != null)
        {
            string id = lb.Text;
            var forms = from x in config.Root.Descendants("Form")
                        where x.Attribute("CategoryId").Value == id
                        select new
                        {
                            FormTitle = x.Attribute("Title").Value,
                            FormDescription = x.Attribute("Description").Value,
                            Url = x.Attribute("Url").Value,
                            Icon = "Forms/Icons/" + x.Attribute("Icon").Value
                        };

            Repeater temp = e.Item.FindControl("rp_forms") as Repeater;
            temp.DataSource = forms;
            temp.DataBind();

        }
    }

    protected override void OnLoad(EventArgs e)
    {
        if (!IsPostBack)
            DataBind();

    }

    private XDocument config = null;

    public override void DataBind()
    {
        //先读取分类数据
        config = XDocument.Load(Server.MapPath("Forms/Forms.xml"));
        var categories = from x in config.Root.Descendants("Category")
                         orderby x.Attribute("Id").Value
                         select new
                         {
                             Title = x.Attribute("Title").Value,
                             Id = x.Attribute("Id").Value,
                             Description = x.Attribute("Description").Value
                         };
        rp.DataSource = categories;
        rp.DataBind();


    }
    
    
    
</script>

<html>
<head id="Head1" runat="server">

    <script src="jquery-1.3.2-vsdoc.js" type="text/javascript"></script>
    <script src="widget.js" type="text/javascript"></script>
    <link href="Style/Widget.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        li.formli
        {
            list-style-type: none;
            width: 300px;
            float: left;
        }
        li.formli img
        {
            border: none;
        }
    </style>
</head>
<body>
    <h2>
        表单中心</h2>
    <p>
        这里将列出了所有的表单,您可以通过这里进行表单填写</p>
    <div id="formscontainer">
        <asp:Repeater ID="rp" runat="server">
            <ItemTemplate>
                <div class="widget">
                    <div class="title">
                        <div class="icon">
                        </div>
                        <h3>
                            <%# Eval("Title") %>
                            <asp:Label ID="categoryId" runat="server" Text='<%# Eval("Id") %>' Visible="false"></asp:Label>
                        </h3>
                    </div>
                    <div class="details">
                        <asp:Repeater ID="rp_forms" runat="server">
                            <HeaderTemplate>
                                <ul>
                            </HeaderTemplate>
                            <ItemTemplate>
                                <li class="formli">
                                    <img src='<%# Eval("Icon") %>' />
                                    <a href='<%# Eval("Url") %>'>
                                        <%# Eval("FormTitle") %>
                                    </a>
                                    <div style="padding-left:40px">
                                        <%# Eval("FormDescription") %>
                                    </div>
                                </li>
                            </ItemTemplate>
                            <FooterTemplate>
                                </ul></FooterTemplate>
                        </asp:Repeater>
                    </div>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </div>
    <div class="widget" autoOpen="false">
        <div class="title">
            <div class="icon">
            </div>
            <h3>
            异步加载的内容
            </h3>
        </div>
        <div class="details" action="AsyncDataPage.aspx">
        </div>
    </div> 
</body>
</html>

页面效果

jquery ui中 accordion的问题及我的解决方法

点击“异步加载的内容”

jquery ui中 accordion的问题及我的解决方法

jquery ui中 accordion的问题及我的解决方法