【问题标题】:Bootstrap Accordion Expand/Collapse All not functioning properlyBootstrap Accordion Expand/Collapse All 无法正常工作
【发布时间】:2017-03-01 17:18:48
【问题描述】:

打破这个的过程如下:

  1. 点击乐谱
  2. 单击展开/全部折叠
  3. 点击乐谱
  4. 单击展开/全部折叠
  5. 再次单击展开/全部折叠

请注意 Music Notation 不会重新打开,即使您应该能够在函数中看到,逻辑表明所有面板都已关闭并且应该打开。为什么?我做错了什么?

HTML:

<button class="btn btn-default btn-sm btn-exp" id="expandAllFormats">Expand/Collapse All</button>
<div class="panel-group checkbox-group" id="accordionFormat" role="tablist" aria-multiselectable="true">

<div class="panel panel-default">
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a id="accordionformatText" role="button" data-toggle="collapse" data-parent="#accordionFormat" href="#formatText">
<i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Text
</a>
</h4>
</div>
<div id="formatText" class="panel-collapse collapse" role="tabpanel">
<div class="panel-body">ALPHA</div>
</div>
</div>

<div class="panel panel-default">
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a id="accordionformatArt" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordionFormat" href="#formatArt">
<i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Art
</a>
</h4>
</div>
<div id="formatArt" class="panel-collapse collapse" aria-expanded="false" role="tabpanel">
<div class="panel-body">BETA</div>
</div>
</div>

<div class="panel panel-default">
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a id="accordionformatAudio" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordionFormat" href="#formatAudio">
<i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Audio
</a>
</h4>
</div>
<div id="formatAudio" class="panel-collapse collapse" role="tabpanel">
<div class="panel-body">GAMMA</div>
</div>
</div>

<div class="panel panel-default">
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a id="accordionformatNotation" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordionFormat" href="#formatNotation">
<i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Music Notation
</a>
</h4>
</div>
<div id="formatNotation" class="panel-collapse collapse" role="tabpanel">
<div class="panel-body">DELTA</div>
</div>
</div>

<div class="panel panel-default">
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a id="accordionformatVideo" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordionFormat" href="#formatVideo">
<i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Video
</a>
</h4>
</div>
<div id="formatVideo" class="panel-collapse collapse" role="tabpanel">
<div class="panel-body">EPSILON</div>
</div>
</div>

<div class="panel panel-default">
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a id="accordionformatInteractive" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordionFormat" href="#formatInteractive">
<i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Digital Interactive
</a>
</h4>
</div>
<div id="formatInteractive" class="panel-collapse collapse" role="tabpanel">
<div class="panel-body">ZETA</div>
</div>
</div>
</div>

JS:

var toggleFormat = false;
$('#expandAllFormats').on('click', function(e) {
        e.preventDefault();
        console.log(toggleFormat);
        $("#accordionFormat .panel-collapse").each(function(index, value){
            if (toggleFormat){
                if($(this).hasClass('in')){
                    $(this).collapse('toggle');
                    console.log("This panel is open. it will be closed");
                } else {
                    console.log("This panel is closed. it will stay closed");
                }
            } else {
                if(!$(this).hasClass('in')){
                    $(this).collapse('toggle');
                    console.log("This panel is closed. it will be open");
                } else {
                    console.log("This panel is open. it will stay open");
                }
            }

        });
        toggleFormat = toggleFormat ? false : true;
    });

【问题讨论】:

  • 我还应该注意,如果您单击音乐符号打开该备份,它将打开那个面板,但关闭所有其他面板...
  • 请检查我的答案并试一试。
  • 你确定吗?我无法在我的答案的 sn-p 中重现该问题。
  • 也许 b/c 是 sn-p 的引导版本,即 bootstrap/3.3.7

标签: javascript jquery html twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

问题在于 所有 面板的状态与 任何单个 面板的状态不同,因为手风琴与 data-parent 的工作方式不同。您的展开/折叠所有按钮处理程序需要完全覆盖正常的手风琴行为。

展开/折叠全部点击处理程序必须跟踪最后状态(展开全部或折叠全部),因为 Bootstrap Collapse 组件单独处理每个面板的状态(一次只打开一个)。 否则,将无法知道是打开还是关闭单独切换的面板。

$('#expandAllFormats').on('click', function () {

   if ($(this).data("lastState") === null || $(this).data("lastState") === 0) {

        // close all
        $('.collapse.in').collapse('hide');

        // next state will be open all
        $(this).data("lastState",1);
        $(this).text("Expand All");

    }
    else {

        // initial state...
        // override accordion behavior and open all
        $('.panel-collapse').removeData('bs.collapse')
        .collapse({parent:false, toggle:false})
        .collapse('show')
        .removeData('bs.collapse')
         // restore single panel behavior
        .collapse({parent:'#accordionFormat', toggle:false});

        // next state will be close all
        $(this).data("lastState",0);
        $(this).text("Collapse All");
    }

});

http://codeply.com/go/76Hl6s49rb

OFC,另一种方法是简单地删除data-parent= 属性并完全禁用手风琴行为。

【讨论】:

    【解决方案2】:

    如果您有能力从存在的所有元素中删除 data-parent 属性 data-parent="#accordionFormat",它将解决您的问题。

    为什么?我不确定,但似乎该属性触发了一些与折叠功能混淆的逻辑。

    var toggleFormat = false;
    $('#expandAllFormats').on('click', function (e) {
        e.preventDefault();
        console.log(toggleFormat);
        $("#accordionFormat .panel-collapse").each(function (index, value) {
            if (toggleFormat) {
                if ($(this).hasClass('in')) {
                    $(this).collapse('toggle');
                    console.log("This panel is open. it will be closed");
                } else {
                    console.log("This panel is closed. it will stay closed");
                }
            } else {
                if (!$(this).hasClass('in')) {
                    $(this).collapse('toggle');
                    console.log("This panel is closed. it will be open");
                } else {
                    console.log("This panel is open. it will stay open");
                }
            }
    
        });
        toggleFormat = toggleFormat ? false : true;
    });
    <html>
    <head>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    
    <body>
    <button class="btn btn-default btn-sm btn-exp" id="expandAllFormats">Expand/Collapse All</button>
    
    <div class="panel-group checkbox-group" id="accordionFormat" role="tablist" aria-multiselectable="true">
    
        <div class="panel panel-default">
            <div class="panel-heading" role="tab">
                <h4 class="panel-title">
                    <a id="accordionformatText" role="button" data-toggle="collapse" href="#formatText">
                        <i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Text
                    </a>
                </h4>
            </div>
    
            <div id="formatText" class="panel-collapse collapse" role="tabpanel">
                <div class="panel-body">ALPHA</div>
            </div>
        </div>
    
        <div class="panel panel-default">
            <div class="panel-heading" role="tab">
                <h4 class="panel-title">
                    <a id="accordionformatArt" class="collapsed" role="button" data-toggle="collapse" href="#formatArt">
                        <i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Art
                    </a>
                </h4>
            </div>
    
            <div id="formatArt" class="panel-collapse collapse" aria-expanded="false" role="tabpanel">
                <div class="panel-body">BETA</div>
            </div>
        </div>
    
        <div class="panel panel-default">
            <div class="panel-heading" role="tab">
                <h4 class="panel-title">
                    <a id="accordionformatAudio" class="collapsed" role="button" data-toggle="collapse" href="#formatAudio">
                        <i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Audio
                    </a>
                </h4>
            </div>
    
            <div id="formatAudio" class="panel-collapse collapse" role="tabpanel">
                <div class="panel-body">GAMMA</div>
            </div>
        </div>
    
        <div class="panel panel-default">
            <div class="panel-heading" role="tab">
                <h4 class="panel-title">
                    <a id="accordionformatNotation" class="collapsed" role="button" data-toggle="collapse"
                       href="#formatNotation">
                        <i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Music Notation
                    </a>
                </h4>
            </div>
    
            <div id="formatNotation" class="panel-collapse collapse" role="tabpanel">
                <div class="panel-body">DELTA</div>
            </div>
        </div>
    
        <div class="panel panel-default">
            <div class="panel-heading" role="tab">
                <h4 class="panel-title">
                    <a id="accordionformatVideo" class="collapsed" role="button" data-toggle="collapse" href="#formatVideo">
                        <i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Video
                    </a>
                </h4>
            </div>
    
            <div id="formatVideo" class="panel-collapse collapse" role="tabpanel">
                <div class="panel-body">EPSILON</div>
            </div>
        </div>
    
        <div class="panel panel-default">
            <div class="panel-heading" role="tab">
                <h4 class="panel-title">
                    <a id="accordionformatInteractive" class="collapsed" role="button" data-toggle="collapse"
                       href="#formatInteractive">
                        <i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Digital Interactive
                    </a>
                </h4>
            </div>
    
            <div id="formatInteractive" class="panel-collapse collapse" role="tabpanel">
                <div class="panel-body">ZETA</div>
            </div>
        </div>
    </div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </body>
    </html>

    【讨论】:

    • 与问题完全无关,但你的这个小提示解决了我的问题——能够扩展任何部分并保持扩展。也就是说,完全忽略当您展开第一部分而不是展开第二部分时第一个折叠的功能。谢谢。
    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 2022-07-05
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2016-12-07
    相关资源
    最近更新 更多