动态展开可折叠内容

Posted

技术标签:

【中文标题】动态展开可折叠内容【英文标题】:Dynamically Expand Collapsible Content 【发布时间】:2014-03-26 13:48:12 【问题描述】:

我想扩展 jQuery Mobile 可折叠内容部分的可折叠内容。我知道我可以单击标题来展开它,但我不想依赖用户在每次页面刷新时都单击相同的部分。我知道我可以在 html 中设置一个变量,但这不会,因为可折叠的内容仍然会在回发时关闭。

我需要使用代码而不是用户来完成此操作。你可以在下面看到我失败的尝试。我使用 VS 2013 的 Web 表单项目中的模板作为开始,然后我添加了 jQuery Mobile 并按照 jQuery Mobile 的site 的说明进行操作,或者我是这么认为的。这是一个简化的测试页面,但最终,我希望有一个 ASP.NET 变量来检测在回发时是否已经点击了一个部分,如果已经点击了一个可折叠部分,请再次打开它,这样用户就不会必须再次点击同一个地方。有什么办法可以保持展开状态或者动态展开jQuery Mobile的可折叠内容?

<%@ Page Title="Home Page" Language="VB" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.vb" Inherits="ExpandTest._Default" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">

    <script>
        $(".myDiv").trigger("expand");
    </script>

    <div class="jumbotron">
        <h1>ASP.NET</h1>
        <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and javascript.</p>
        <p><a href="http://www.asp.net" class="btn btn-primary btn-large">Learn more &raquo;</a></p>
    </div>

    <div class="row">
        <div class="myDiv" data-role="collapsible">
            <h2>Getting Started</h2>
            <p>ASP.NET Web Forms lets you build dynamic websites using a familiar drag-and-drop, event-driven model. A design surface and hundreds of controls and components let you rapidly build sophisticated, powerful UI-driven sites with data access.
            </p>
            <p>
                <a class="btn btn-default" href="http://go.microsoft.com/fwlink/?LinkId=301948">Learn more &raquo;</a>
            </p>
        </div>
    </div>

</asp:Content>

-- 编辑-- 我尝试过的事情(即使只是为了概念证明)失败了:

$(".myDiv").trigger('expand'); // Apparently does not execute
$('.myDiv').on("click", alert("Fe Fi Foo Bar!");); // does not run anything within
$(document).on("pagecreate", function () 

另外,我最近读到 document.ready 应该用于 jQuery,但 not jQuery Mobile。说明我不能使用其他用户似乎认为有效的相同代码以及已经在jsfiddle 中有效的相同代码。这让我相信我遗漏了一些应该很明显的东西。我已经修改了加载 jQuery Mobile 与代码相关的顺序,但无济于事。

【问题讨论】:

您是否尝试过可折叠 div 中的data-collapsed="false" 属性?如果您使用的是 JQM 1.4 $(".selector").collapsible("expand");. data-collapsed="false" 无论天气如何都保持同一个集合打开我希望它打开,即它不是动态的。我正在使用 JQM 1.4 和 $(".myDiv").collapsible("expand"); 不能以某种方式使用它。 @Omar 如果$(".myDiv").collapsible("expand"); 以任何方式为您工作我想知道您何时何地加载 JQM 以及何时何地加载自定义脚本? 我添加了&lt;a id="btn" href="#" data-role="button"&gt; Open / close menus &lt;/a&gt;和` $("#btn").bind("click", function (event) $("h2.ui-collapsible-heading").trigger(" click"); );` 会触发点击。现在我只需要在pageinit 上触发一个展开事件。 使用pagecontainbeforeshow 而不是pageinit$("#col_id").collapsible("expand");. 【参考方案1】:

在启用视图状态的页面中添加一个 ASP.Net 隐藏字段。

jQM 可折叠具有展开和折叠的事件。在客户端,您可以处理这些事件并创建当前展开的可折叠项的列表,并将此列表保存到隐藏字段。回发后,pagecreate 事件中的客户端代码可以从隐藏字段中读取列表并展开这些项目。

为所有可折叠的 div 分配 ID,然后您可以将逗号分隔的 ID 列表保存到隐藏输入:

$(document).on("pagecreate", "#page1", function()
    var prevExpanded =  $("#hidden").val().split(',');
    $.each( prevExpanded, function( key, value ) 
          $("#" + value).collapsible( "option", "collapsed", false );
    );

    $( "[data-role=collapsible]" ).on("collapsiblecollapse collapsibleexpand", function( event, ui ) 
             GetAllExpanded();    
    );
);


function GetAllExpanded()
    var AllExpanded = [];
    $( "[data-role=collapsible]" ).not(".ui-collapsible-collapsed").each(function( index ) 
      AllExpanded.push($(this).prop("id"));
    );
    $("#hidden").val(AllExpanded.join(','));

【讨论】:

【参考方案2】:

使用&lt;asp:hidden&gt; 字段,并在展开时更改它们的值。然后您将能够在回发时设置$(".col-md-4").trigger("expand"); 的值。

【讨论】:

【参考方案3】:

以下是可行的,尽管我仍然不知道在 Web 窗体上工作的更好方法,我必须找到一种有条件地加载它的方法,也许使用前面建议的隐藏字段。谢谢您的帮助。

<script type="text/javascript">
    $(function () 
        $("h2.ui-collapsible-heading").trigger("click");
    );
</script>

【讨论】:

以上是关于动态展开可折叠内容的主要内容,如果未能解决你的问题,请参考以下文章

考虑到动态内容高度,使用 vue 过渡平滑展开/折叠过渡

如何动态计算自定义展开/可折叠 UITableViewCell 的高度

展开或折叠时可展开的 UItableview 内容高度不同

如何在 Qt 中制作可展开/可折叠的部分小部件

如何使用 Bootstrap-Vue 从父组件折叠/展开多个动态折叠?

Bootstrap + Angular动态菜单在展开后不折叠