Twitter bootstrap 你如何让推特引导手风琴保持一组开放?

Twitter bootstrap 你如何让推特引导手风琴保持一组开放?,twitter-bootstrap,accordion,twitter-bootstrap-3,Twitter Bootstrap,Accordion,Twitter Bootstrap 3,我正在尝试使用Twitter引导程序使用accordion和collapse插件来模拟Outlook栏,到目前为止,我已经让collapse和accordion正常工作了,但是现在它允许所有部分都被折叠 我想限制它,以便始终显示一个且只有一个 这就是我正在研究的一个:我认为它是沿着 $('#accordions')。关于('hide',函数(事件){ console.warn(“隐藏已触发,检查是否尝试隐藏活动的,如果是,则停止”); }) 这里有一个简单的方法: 新引导3 用于引导3。 引导程

我正在尝试使用Twitter引导程序使用accordion和collapse插件来模拟Outlook栏,到目前为止,我已经让collapse和accordion正常工作了,但是现在它允许所有部分都被折叠

我想限制它,以便始终显示一个且只有一个

这就是我正在研究的一个:我认为它是沿着

$('#accordions')。关于('hide',函数(事件){
console.warn(“隐藏已触发,检查是否尝试隐藏活动的,如果是,则停止”);
})

这里有一个简单的方法:

新引导3 用于引导3。

引导程序3的代码:

$('.panel heading a')。在('click',函数(e)上{
if($(this).parents('.panel').children('.panel collapse').hasClass('in')){
e、 停止传播();
}
//您还可以添加preventDefault以删除使
//页面跳转
//e.预防违约();
});
代码检查单击的元素是否是当前显示的元素(由类“in”显示),如果它确实有“in”类,则停止隐藏过程


不推荐的引导程序2 用于引导程序2。

引导程序2的代码:

$('.accordio toggle')。打开('click',函数(e){
if($(this).parents('.accordion group').children('.accordion body').hasClass('in')){
e、 停止传播();
}
//您还可以添加preventDefault以删除使
//页面跳转
//e.预防违约();
});


注意:如果您想在手风琴上附加更多的点击事件,请小心,因为
e.stopPropagation()
将阻止检查后发生的事件。

我想精确说明@Hugo Dozois的答案

您应该添加
e.preventDefault()
如果您的页面中有一个滚动条,则防止
#
HTML锚的默认行为

$('.panel-heading a').on('click',function(e){
    if($(this).parents('.panel').children('.panel-collapse').hasClass('in')){
        e.preventDefault();
        e.stopPropagation();
    }
});

或者您可以使用简单的CSS技巧,如下所示:

/*
prevent the active panel from collapsing
 */
.panel-group [aria-expanded=true]{
  /*
  http://caniuse.com/#feat=pointer-events
  Works for MOST modern browsers. (- Opera Mobile)
  */
  pointer-events: none;
}
非活动面板链接上必须有适当的标签

 aria-expanded="false"

根据bootstarp 3.3.6版本


这里有一具尸体
塌陷体2
2018年更新

下面介绍了如何在引导程序v3或v4中至少保持打开状态。这意味着打开的手风琴只能通过切换另一个打开的手风琴来关闭

引导4

此外,它还显示了如何指定一个“默认”手风琴,该手风琴将在所有其他手风琴关闭时打开


引导3

$('[data-toggle="collapse"]').on('click',function(e){
    if($(this).parents('.panel').find('.collapse').hasClass('in')){
        var idx = $(this).index('[data-toggle="collapse"]');
        var idxShown = $('.collapse.in').index('.accordion-body');
        if (idx==idxShown) {
            e.stopPropagation();
        }
    }
});


问题1?
..
问题2?
..
问题3?
...
注意:引导程序3中需要
面板
类)

引导程序4.0
此代码块检查单击的卡是否折叠(通过使用类查看div
collapse
)。当卡当前
show
n时,它会停止。

因为所有其他JS答案都使用
stopPropagation()
这里是我的解决方案,仅使用本机引导事件(在引导4上测试)

$('#accordionExample').on('show.bs.collapse', function () {
    $(this).data('isShowing', true);
});

$('#accordionExample').on('hide.bs.collapse', function (event) {
    if (!$(this).data('isShowing')) {
        event.preventDefault();
    }

    $(this).data('isShowing', false);
});

它利用了这样一个事实:点击一个折叠的元素将导致
显示.bs.collapse
,然后是
隐藏.bs.collapse
。尽管单击open元素只会导致一个
隐藏.bs.collapse

我有一个场景不适合任何发布的答案:同一页面上有多个accord,以及一些其他可折叠的组件,它们不是accord(没有
数据父项
属性)

此代码仅在手风琴上触发,因为会检查
数据父项
属性。 它也不采用
(或引导3的
面板
)结构,它使用与引导api相同的属性


我希望它能有所帮助。

提供的解决方案都不允许在同一页面中有多个手风琴,保持或不打开一个选项卡

以下是我的解决方案:

$("[data-toggle=buttons][data-oneopen=true] [data-toggle=collapse]").on("click", function (e) {
  var me = $(this);
  var target = $(me.attr("data-target") || me.attr("href"));
  if (target.hasClass("show")) {
    e.stopPropagation();
  }
});
首先,我选择了一个
dataoneopen
属性来标记这些手风琴按钮以启用此行为,但它可以替换为类或任何其他选择器

然后我检查
数据目标
href
属性以查找相关选项卡


最后,我
stopPropagation
如果项目有
show
类,只需在
类中将其更改为
,即可获得引导3的解决方案。

谢谢!没有使用完全相同的解决方案,但我需要的是
e.stopPropagation()
!漂亮的添加e.preventDefault();在if语句之后,您的页面将不会在点击时跳转。非常感谢!它可以工作,但对于尚未折叠的图元,它不会工作。只有在第二个操作中。@Artistan此解决方案才能正常工作。但它是有效的。可折叠块必须是具有
面板
类的块的子级。你可以举个例子。@gleb kemarsky它没有。主题清楚地说“保持一个组打开”,而您的“解决方案”允许折叠唯一打开的组“保持无打开”。@kpull1感谢您的澄清。我似乎误解了问题作者所遇到的困难。除了更好的造型外,我建议您帮助我解决这个问题,使用
.on(“单击”,函数…
方式,以确保它在第一次使用后也能正常工作。
$('.card').click(function(e) {
  if (
    $(this)
      .find('.collapse')
      .hasClass('show')
  ) {
    e.stopPropagation();
  }
});
$('#accordionExample').on('show.bs.collapse', function () {
    $(this).data('isShowing', true);
});

$('#accordionExample').on('hide.bs.collapse', function (event) {
    if (!$(this).data('isShowing')) {
        event.preventDefault();
    }

    $(this).data('isShowing', false);
});
$("[data-toggle=collapse][data-parent]").click(function (e) {
    var button = $(this);
    var parent = $(button.attr("data-parent"));
    var panel = parent.find(button.attr("href") || button.attr("data-target"));
    if (panel.hasClass("in")) {
        e.preventDefault();
        e.stopPropagation()
    }
});
$("[data-toggle=buttons][data-oneopen=true] [data-toggle=collapse]").on("click", function (e) {
  var me = $(this);
  var target = $(me.attr("data-target") || me.attr("href"));
  if (target.hasClass("show")) {
    e.stopPropagation();
  }
});