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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 原文:jquery ui中 accordion的问题及我的解决方法jquery有一套所谓的ui组件,很不错的。如果有兴趣的朋友,可以参考http://jqueryui.com/ 但其中的accordion,我使用的时候发现一些问题。
原文: jquery ui中 accordion的问题及我的解决方法

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>
开始的时候,看起来不错

image

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

image

发现了吗,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>

页面效果

image

点击“异步加载的内容”

image

image

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
JSON 前端开发 JavaScript
【前端】使用jQuery封装一套UI组件 - 级联选择器组件
本篇文章来讲解下级联选择器组件 级联选择器,在实际项目中也是比较常用的组件,比如:省市区三级关联,上下级联动等 最后面会附上全部代码
1335 0
|
JavaScript
VUE element-ui 之slot-scope=“scope“常见报错解决方法
VUE element-ui 之slot-scope=“scope“常见报错解决方法
1284 0
VUE element-ui 之slot-scope=“scope“常见报错解决方法
|
5月前
|
Web App开发 缓存 JavaScript
JQuery Kendo UI使用技巧总结
JQuery Kendo UI使用技巧总结
42 4
|
1月前
|
JavaScript API 容器
jQuery Accordion
jQuery Accordion
15 4
jquery-easyui和jquery-ui的slider冲突解决
jquery-easyui和jquery-ui的slider冲突解决
|
JavaScript 前端开发 测试技术
JQuery iframe宽高度自适应浏览器窗口大小的解决方法
JQuery iframe宽高度自适应浏览器窗口大小的解决方法
266 0
|
JavaScript
element-ui-admin不能运行npm run dev的解决方法以及依赖报错npm ERR code 128解决办法
element-ui-admin不能运行npm run dev的解决方法以及依赖报错npm ERR code 128解决办法
398 0
|
JavaScript 前端开发 程序员
【前端】使用jQuery封装一套UI组件 - 是和否滑动切换组件
本篇文章来讲解下是和否的滑动切换组件 切换滑动组件,使用的场景实际上就是一个开和关的场景,一般有是和否,开和关,禁用和启用等等,只需要设置0和1即可
151 0
|
JavaScript 前端开发 程序员
【前端】使用jQuery封装一套UI组件 - 可编辑下拉框组件
下拉框也是比较常用的组件,对应原生的下拉标签就是select 本篇文章就来讲讲可编辑下拉框组件的封装过程
366 0
|
JavaScript 前端开发 程序员
【前端】使用jQuery封装一套UI组件 - 移动端时间选择组件
【首先要声明一点,技术不分好坏,能用好就行,不用鄙视老技术】 今天要给大家展示的是移动端时间选择组件 最开始,看到比较新颖的移动端时间选择组件是在某款手机上,分年月日下拉选择,UI界面也挺好看的 除了讲解实现的步骤以及关键点,文章最后面会有完整的代码
245 0