17

我遇到了 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');
});

我的 jsfiddle 演示了这个问题

重现:

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

因此,以编程方式打开面板似乎会弄乱有关面板状态的引导程序内部注册?我没有看到第三个面板的“状态变化”有任何明显的错误(它的类从“崩溃”变为“进入”并返回,正如你所期望的那样)。

4

3 回答 3

28

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

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

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

Bootply 演示

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

于 2013-10-03T11:56:42.927 回答
2

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

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

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

于 2015-01-18T14:29:43.470 回答
0

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

var expandAccordion = function() {
    var header = $('[data-target="#accordion-0"]');
    if (header.hasClass('collapsed')) {
        header.click();
    }
}
于 2017-11-23T15:38:49.780 回答