Bootstrap Accordion展开/折叠全部无法正常工作

时间:2017-03-01 17:18:49

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

这是解决这个问题的过程:

  1. 点击音乐记谱法
  2. 点击展开/全部折叠
  3. 点击音乐记谱法
  4. 点击展开/全部折叠
  5. 再次点击展开/全部折叠
  6. 注意音乐符号不会打开备份,即使您应该能够在函数中看到逻辑表明所有面板都已关闭且应该打开。为什么?我做错了什么?

    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;
        });
    

2 个答案:

答案 0 :(得分:2)

问题在于所有面板的状态与任何单个面板的状态不同,因为accordion与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://www.codeply.com/go/76Hl6s49rb

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

答案 1 :(得分:1)

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

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

&#13;
&#13;
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;
});
&#13;
<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>
&#13;
&#13;
&#13;