Bootstrap 3 jQuery事件,用于活动选项卡更改


286

当启动3选项卡/导航栏的选项卡更改时,我花了不切实际的时间尝试触发功能,而实际上Google吐槽的所有建议都是错误的/没有用。

怎么办呢?

元编辑:查看评论


3
这真的很有用!如果只想监视特定的选项卡,则可以监视$(“ a [href ='#tab_name']”)。on('shown.bs.tab',fn)当然,如果不保证a [href ='#tab_name']是唯一的。
msanjay 2014年


@rogerdpack“ stackoverflow.com/questions/13164239/... ”显得扑朔迷离重定向到,它的提问采取了错误的道路,寻找它的范围之内回答的问题是,过长的和具体的和接受的答案似乎反映,由于这当然不是我问题的有效答案。这个问题可能对许多人没有帮助的事实与此有关。
Gerben Rampaart

Answers:


451

埃里克·索普(Eric Saupe)知道该怎么做

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  var target = $(e.target).attr("href") // activated tab
  alert(target);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="myTab" class="nav nav-tabs">
  <li class="active"><a href="#home" data-toggle="tab">Home</a></li>
  <li class=""><a href="#profile" data-toggle="tab">Profile</a></li>
</ul>
<div id="myTabContent" class="tab-content">
  <div class="tab-pane fade active in" id="home">
    home tab!
  </div>
  <div class="tab-pane fade" id="profile">
    profile tab!
  </div>
</div>


非常感谢,花了一些时间在找到答案之前,您真是太棒了!
哈贾特(Hajjat​​)2015年

1
如果你必须使用变更事件(不管从链接的动作),只需使用$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
艾琳·马托斯

完美,为此节省了我很多时间!
贾斯汀

我对此有一点怀疑。我将声明target为全局变量,并如上所述分配了值。第一次加载页面时,得到的target的值(警报)为未定义。但是,当我更改选项卡并将该值分配给目标时,我没有收到任何警报。甚至没有错误消息。为了将其带出循环,我该怎么办?我已经在document.ready函数外部声明了该变量。
SSS

仅当我单击另一个选项卡时,此方法才有效。如何为默认选项卡添加该触发器?我需要在每个选项卡上加载ajax。但是,只有当我单击另一个选项卡,然后再单击第一个选项卡时,它才会加载。
卡里斯·雅尼斯塞尔斯(KārlisJanisels)'16

89
$(function () {
    $('#myTab a:last').tab('show');
});

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
    var target = $(e.target).attr("href");
    if ((target == '#messages')) {
        alert('ok');
    } else {
        alert('not ok');
    }
});

问题是attr('href')永远不会为空。

或者比较#id =“ #some value”,然后调用ajax。


是的,只是attr('href')从来都不是模范。它返回选项卡的ID。
Florin

1
我明白。我认为我对所有人的评论都集中在“ shown.bs.tab”位。我很难追踪到这一点。
Gerben Rampaart 2013年

1
好的...添加了:empty选择器。
Gerben Rampaart 2013年

谢谢。像个魅力!
丹妮·埃雷拉

谢谢@弗洛林。我的问题已通过您的功能解决。喜欢!
Aiyoub Amini

32

感谢@Gerben的帖子,了解了两个事件show.bs.tab(在显示选项卡之前)和show.bs.tab(在显示选项卡之后),如文档中所述-Bootstrap选项卡的用法

如果我们只对特定选项卡感兴趣,并且可能添加单独的函数而不必在一个函数中添加if-else块,则另一种解决方案是使用href选择器(如果需要,可以与其他选择器一起使用)

 $("a[href='#tab_target_id']").on('shown.bs.tab', function(e) {
      console.log('shown - after the tab has been shown');
 });

 // or even this one if we want the earlier event
 $("a[href='#tab_target_id']").on('show.bs.tab', function(e) {
      console.log('show - before the new tab has been shown');
 });

演示


很棒的解决方案,我需要在制表符显示事件之后捕捉并调用我的angular函数,此解决方案为我节省了几个小时!
艾伦(Allen)

10

要添加到Mosh Feu答案中,如果在我的情况下即时创建选项卡,则应使用以下代码

$(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) {
    var tab = $(e.target);
    var contentId = tab.attr("href");

    //This check if the tab is active
    if (tab.parent().hasClass('active')) {
         console.log('the tab with the content id ' + contentId + ' is visible');
    } else {
         console.log('the tab with the content id ' + contentId + ' is NOT visible');
    }

});

我希望这可以帮助别人


8

这对我有用。

$('.nav-pills > li > a').click( function() {
    $('.nav-pills > li.active').removeClass('active');
    $(this).parent().addClass('active');
} );

非常适合我。
MattD 2014年

1
此劫机程序引导默认选项卡功能。如果必须执行此操作,则选项卡不会初始化。
Archonic

2
这是一种“ hacky”方式,应避免。
朱尼·布鲁萨斯

2

我使用另一种方法。

只是尝试找到所有从某个子字符串开始的a地方。id

JS

$('a[id^=v-photos-tab]').click(function () {
     alert("Handler for .click() called.");
});

的HTML

<a class="nav-item nav-link active show"  id="v-photos-tab-3a623245-7dc7-4a22-90d0-62705ad0c62b" data-toggle="pill" href="#v-photos-3a623245-7dc7-4a22-90d0-62705ad0c62b" role="tab" aria-controls="v-requestbase-photos" aria-selected="true"><span>Cool photos</span></a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.