简体   繁体   English

Bootstrap Accordion Expand/Collapse 全部功能不正常

[英]Bootstrap Accordion Expand/Collapse All not functioning properly

Here's the process to break this:这是打破这个的过程:

  1. click Music Notation单击乐谱
  2. click Expand/Collapse All单击全部展开/折叠
  3. click Music Notation单击乐谱
  4. click Expand/Collapse All单击全部展开/折叠
  5. click Expand/Collapse All again再次单击展开/折叠全部

Notice how Music Notation will NOT open back up, even though, you should be able to see in the function, that the logic says that ALL panels are closed and should open.请注意 Music Notation 不会重新打开,即使您应该能够在函数中看到,逻辑表明所有面板都已关闭并且应该打开。 WHY?为什么? What am I doing wrong?我究竟做错了什么?

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

The problem is that the state of all panels is different than the state of any single panel because of the way accordion works with data-parent .问题是所有面板的状态不同于任何单个面板的状态,因为手风琴与data-parent Your expand/collapse all button handler needs to completely override that normal accordion behavior.您的展开/折叠所有按钮处理程序需要完全覆盖正常的手风琴行为。

The expand/collapse all click handler must keep track of the last state (expand all or collapse all ), because the Bootstrap Collapse component is seperately handing the state of each single panel (only one open at a time). expand/collapse all点击处理程序必须跟踪最后一个状态(expand all或 collapse all ),因为 Bootstrap Collapse 组件单独处理每个面板的状态(一次只打开一个)。 Otherwise, there would be no way to know whether to open or close the individually toggled panels.否则,将无法知道是打开还是关闭单独切换的面板。

$('#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 http://codeply.com/go/76Hl6s49rb

OFC, another way is to simply remove the data-parent= attributes and completely disable the accordion behavior. OFC,另一种方法是简单地删除data-parent=属性并完全禁用手风琴行为。

If you can afford to remove the data-parent attribute data-parent="#accordionFormat" from all elements where it exists it will solve your issue.如果您有能力从存在的所有元素中删除 data-parent 属性data-parent="#accordionFormat"它将解决您的问题。

Why?为什么? I'm not sure but it seems that attribute triggers some logic that messes up with the collapse functionality.我不确定,但似乎该属性触发了一些与折叠功能混乱的逻辑。

 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM