以编程方式打开面板后,Bootstrap 3 折叠可以打开多个面板

Posted

技术标签:

【中文标题】以编程方式打开面板后,Bootstrap 3 折叠可以打开多个面板【英文标题】:Bootstrap 3 collapse can have multiple panels open after programmatically opening a panel 【发布时间】:2013-10-10 02:18:49 【问题描述】:

我遇到了 bootstrap 3 崩溃的问题,在以编程方式打开面板后,可以在重新打开第一个面板时保持另一个面板打开。

我的HTML

<button type="button" class="btn showpanel">Show panel 3</button>
<button type="button" class="btn hidepanel">Hide panel 3</button>
<button type="button" class="btn openpanel">Open panel 3</button>
<button type="button" class="btn closepanel">Close panel 3</button>
<hr/>
<div class="panel-group" id="accordion">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h4 class="panel-title">
                <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#panel1">Panel 1</a>
            </h4>
        </div>
        <div id="panel1" class="panel-collapse collapse">
            <div class="panel-body">
                Contents panel 1
            </div>
        </div>
    </div>
    <div class="panel panel-default">
        <div class="panel-heading">
            <h4 class="panel-title">
                <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#panel2">Panel 2</a>
            </h4>
        </div>
        <div id="panel2" class="panel-collapse collapse">
            <div class="panel-body">
                Contents panel 2
            </div>
        </div>
    </div>
    <div class="panel panel-default">
        <div class="panel-heading">
            <h4 class="panel-title">
                <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#panel3">Panel 3</a>
            </h4>
        </div>
        <div id="panel3" class="panel-collapse collapse">
            <div class="panel-body">
                Contents panel 3
            </div>
        </div>
    </div>
</div>

还有一些 JavaScript

$(".hidepanel").on("click", function() 
    $("#panel3").parent().hide();
);
$(".showpanel").on("click", function() 
    $("#panel3").parent().show();
);
$(".openpanel").on("click", function() 
    $("#panel3").collapse('show');
);
$(".closepanel").on("click", function() 
    $("#panel3").collapse('hide');
);

My jsfiddle that demonstrates this issue

复制:

    点击“打开面板 3”按钮。 单击“面板 2”将其打开。到目前为止没有问题。 单击“面板 3”再次打开它。面板 2 保持打开状态!

所以以编程方式打开面板似乎会弄乱有关面板状态的引导程序内部注册?我看不出第三个面板的“状态更改”有任何明显错误(它的类从“折叠”更改为“进入”并返回,如您所料)。

【问题讨论】:

我也遇到了同样的问题。 【参考方案1】:

您可以为在显示任何面板之前发生的折叠show 事件创建一个处理程序。

添加此项以确保在显示所选面板之前关闭所有其他打开的面板:

$('#accordion').on('show.bs.collapse', function () 
    $('#accordion .in').collapse('hide');
);

Bootply demo

您可以在此处阅读有关 collapse 事件的更多信息:http://getbootstrap.com/javascript/#collapse

【讨论】:

这当然有效,但我想知道这是否是我们正在解决的已知引导错误。我要检查错误列表。 我不认为这是一个错误。您的按钮正在“手动”控制手风琴通常的打开/关闭行为,这在某些情况下可能是所需的行为。 如果我很好地理解了折叠小部件,由于我使用了 data-parent 属性,我的 html 应该使手风琴充当“最大打开一个面板”,您还可以创建一个“使用 data-target 属性打开多个面板的手风琴(例如参见plnkr.co/edit/OxbVII?p=preview)。所以我认为如果我手动打开或关闭一个面板,手风琴应该遵循这个原则。 这种方法的问题是,当你有嵌套手风琴并且在外部手风琴上有这个处理程序时,它仍然会被内部手风琴上的事件触发。【参考方案2】:

我认为问题出在您更改打开面板的方式上。您需要在适当的面板链接上触发点击事件,而不是使用“显示”功能。例如,使用 id 为“accordion”的手风琴,带有三个面板,如果您想显示 2 个面板,请使用:

$("a[href=#accordion-2]").click()

或者您为第二个面板提供的任何 ID(我使用 twitterboostrapmvc,因此面板 ID 是从手风琴 ID 自动生成的)。

【讨论】:

这也是引导 github 问题中针对此行为推荐的解决方法github.com/twbs/bootstrap/issues/9933【参考方案3】:

对于任何使用data-target 属性来控制手风琴(而不是href 属性)的人,这是对 ProfNimrod 答案的改编,如果目标当前隐藏,它将单击相关元素。 (请注意,if 检查依赖于使用默认应用的collapsed 类设置手风琴,无论如何我觉得这对利用using css to put a chevron icon on the accordions 很有用。

var expandAccordion = function() 
    var header = $('[data-target="#accordion-0"]');
    if (header.hasClass('collapsed')) 
        header.click();
    

【讨论】:

以上是关于以编程方式打开面板后,Bootstrap 3 折叠可以打开多个面板的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式折叠或展开 p:accordionPanel

没有 id 或数据的 Bootstrap 3 可折叠面板

您如何在 Bootstrap 3 中保持多个折叠打开?

bootstrap 3折叠面板内的Jquery Datatable响应式插件

带有预览和溢出扩展的 Bootstrap 4 折叠面板

Bootstrap的js插件之折叠(collapse)