单击时,Bootstrap选项卡关闭

时间:2013-07-06 22:20:01

标签: twitter-bootstrap tabs

我有以下代码:

<div id="action_wrap">
    <div id="action_nav">
        <div class="action" data-target="#content1" data-toggle="tab">First Block</div>
        <div class="action" data-target="#content2" data-toggle="tab">Second Block</div>
        <div class="action" data-target="#content3" data-toggle="tab">Third Block</div>
    </div>
    <div id="action_items">
        <div class="action_text collapse" id="content1">
            <p>Content 1</p>
            <span class="close">Close</span>
            <div class="clearfix"></div>
        </div>
        <div class="action_text collapse" id="content2">
            <p>Content 2</p>
            <span class="close">Close</span>
            <div class="clearfix"></div>
        </div>
        <div class="action_text collapse" id="content3">
            <p>Content 3</p>
            <span class="close">Close</span>
            <div class="clearfix"></div>
        </div>
    </div>
</div>

并使用Twitter Boostrap's "Tab" script,它运行正常。我为关闭按钮添加了一些非常令人讨厌的脚本,并为导航按钮添加了这样的活动类:

$(".action").click(function () {
    $(this).parent().children().removeClass("active");
    $(this).addClass("active");
    $(this).parent().addClass("active");
});

$(".close").click(function () {
    $(this).parent().parent().parent().children().removeClass("active");
    $(this).parent().parent().parent().children().children().removeClass("active");
});

它不多,但是,它正在发挥作用。

我无法做到的是通过单击活动导航div使Bootstrap的Tab可以关闭。 这意味着如果我在#content1,.action_text#content1上点击第一个.action div和data-target将获得.active类,所以.action div我点击它。我想要的是.action.active data-target =“#content1”在点击删除.tab()的类“活动”并且本身相同。

我在另一个线程中发现从Bootstrap的Tab脚本

更改代码
$(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
    e.preventDefault()
    $(this).tab('show')
})

但似乎每次我编辑它,它只是打破了整个事情。我尝试添加if语句,如此

  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
      if ($(this).hasClass('active')) {
        $(this).tab().removeClass('active');
        $(this).removeClass('active');
      } else {
        e.preventDefault()
        $(this).tab('show')
      }
  })

但整件事停止了工作。

2 个答案:

答案 0 :(得分:2)

首先,您应该尽量避免更改Bootstrap本机代码,否则您可能会失去升级到未来版本的能力。

关于你的问题,你可能会遇到一些事件并发问题,我也是......

如果要在单击选项卡切换时关闭活动选项卡,请在此处查看: http://bootply.com/61835(归功于 katie ,我不是此脚本的所有者)

但是,如果您希望能够在以下时间关闭活动标签(切换和窗格):

  • 点击有效标签切换
  • 点击标签切换或窗格外的任何其他位置
  • 按ESC键

...然后这个脚本可以帮助你:

$(function() {

    var active = $('a[data-toggle="tab"]').parents('.active').length;
    var tabClicked = false;

    // Closes current active tab (toggle and pane):
    var close = function() {
        $('a[data-toggle="tab"]').parent().removeClass('active');
        $('.tab-pane.active').removeClass('active');
        active = null;
    }

    // Closing active tab when clicking on toggle:
    $('[data-toggle=tab]').click(function(){
        if ($(this).parent().hasClass('active')){
            $($(this).attr("href")).toggleClass('active');
            active = null;
        } else {
            tabClicked = true;
            active = this;
        }
    });

    // Closing active tab when clicking outside tab context (toggle and pane):
    $(document).on('click.bs.tab.data-api', function(event) {
        if(active && !tabClicked && !$(event.target).closest('.tab-pane.active').length) {
            close();
        }

        tabClicked = false;
    });

    // Closing active tab on ESC key release:
    $(document).keyup(function(e){
        if(active && e.keyCode === 27) { // ESC
            close();
        }
    });
});

您可以使用此JSFiddle尝试: http://jsfiddle.net/almeidap/EAuUY/(使用Bootstrap 3)

答案 1 :(得分:1)

即使使用完全合格的网址,这实际上也会关闭标签。

$('[data-toggle=tab]').click(function(){
  if ($(this).parent().hasClass('active')){
    var url = $(this).attr('href');
    var tid = url.split('#')[1];
    console.log(tid);
    $('#'+tid).toggleClass('active');
    document.location.hash = '';
  }
});
 ///  also can work with pills by switching to $('[data-toggle=pill]')