Bootstrap 3 jquery events สำหรับการเปลี่ยนแท็บที่ใช้งานอยู่


286

ฉันใช้เวลาที่ไม่สมจริงในการพยายามใช้งานฟังก์ชั่นเมื่อแท็บเปลี่ยนจาก bootstrap 3 tab / navbar และคำแนะนำทั้งหมดที่ google spat out ผิด / ไม่ทำงาน

จะไปเกี่ยวกับเรื่องนี้ได้อย่างไร

Meta-edit: ดูความคิดเห็น


3
มันมีประโยชน์จริง ๆ ! หากเราต้องการระวังเฉพาะแท็บใดแท็บหนึ่งเราสามารถรับ $ ("a [href = '# tab_name']"). on ('ที่แสดง .bs.tab', fn) แน่นอนเราสามารถระบุตัวเลือกเพิ่มเติมได้ถ้า [href = '# tab_name'] ไม่รับประกันว่าจะไม่ซ้ำกัน
msanjay


@rogerdpack ' stackoverflow.com/questions/13164239/ …' ดูเหมือนว่าจะทำให้เกิดความสับสนในการเปลี่ยนเส้นทางผู้ถามใช้เส้นทางผิดและมองหาคำตอบภายในขอบเขตคำถามยาวเกินไปและเฉพาะและคำตอบที่ยอมรับนั้นดูเหมือนว่าเพราะ แน่นอนว่าไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามของฉัน ความจริงคำถามนี้ไม่ได้ช่วยคนจำนวนมากอาจเกี่ยวข้องกับที่
Gerben Rampaart

คำตอบ:


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>


ขอบคุณมากใช้เวลากับมันก่อนที่จะพบคำตอบของคุณคุณร็อค!
ฮัจจั

1
หากคุณต้องใช้เหตุการณ์การเปลี่ยนแปลง (โดยไม่คำนึงถึงการกระทำจากลิงค์) เพียงใช้$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
Aline Matos

สมบูรณ์แบบบันทึกฉันด้วยเวลานี้มาก!
Justin

ฉันมีข้อสงสัยเล็กน้อยในเรื่องนี้ ฉันประกาศtargetว่าเป็นตัวแปรโกลบอลและกำหนดค่าตามที่กล่าวไว้ข้างต้น เมื่อฉันโหลดหน้าเว็บครั้งแรกฉันจะได้รับค่า (แจ้งเตือน) ของเป้าหมายเป็นไม่ได้กำหนด แต่เมื่อฉันเปลี่ยนแท็บและกำหนดค่าให้กับเป้าหมายฉันจะไม่ได้รับการแจ้งเตือนใด ๆ ไม่มีแม้แต่ข้อความแสดงข้อผิดพลาด ฉันควรทำอย่างไรเพื่อนำมันออกไปนอกวงนั้น? ฉันประกาศตัวแปรนอกฟังก์ชั่น document.ready
SSS

สิ่งนี้ใช้ได้เฉพาะเมื่อฉันคลิกที่แท็บอื่น วิธีเพิ่มทริกเกอร์นั้นสำหรับแท็บเริ่มต้น ฉันต้องโหลด Ajax บนทุกแท็บ แต่ด้วยวิธีนี้มันจะโหลดก็ต่อเมื่อฉันคลิกที่แท็บอื่นแล้วคลิกอีกครั้ง
Kārlis Janisels

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') ไม่เคยมีอารมณ์ มันคืนรหัสของแท็บ
Florin

1
ฉันเข้าใจ. ฉันคิดว่าความคิดเห็นของฉันที่มีต่อทุกคนมุ่งเน้นไปที่บิต 'display.bs.tab' ฉันมีช่วงเวลาที่ยากลำบากในการติดตามสิ่งนั้น
Gerben Rampaart

1
Okok ... เพิ่ม: ตัวเลือกที่ว่างเปล่า
Gerben Rampaart

ขอบคุณ เหมือนมีเสน่ห์!
dani herrera

ขอบคุณ @Florin ปัญหาของฉันแก้ไขได้ด้วยฟังก์ชั่นของคุณ ชอบ!
Aiyoub Amini

32

ขอบคุณที่โพสต์ของ @ Gerben รู้ว่ามีสองเหตุการณ์ show.bs.tab (ก่อนที่แท็บจะปรากฏขึ้น) และ display.bs.tab (หลังจากแท็บแสดง) ตามที่อธิบายไว้ในเอกสาร - การใช้Bootstrap Tab

ทางออกเพิ่มเติมหากเราสนใจเฉพาะแท็บใดแท็บหนึ่งและอาจเพิ่มฟังก์ชั่นแยกต่างหากโดยไม่ต้องเพิ่ม 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');
 });

การสาธิต


วิธีแก้ปัญหาที่ยอดเยี่ยมฉันต้องจับหลังจากแท็บแสดงเหตุการณ์และเรียกใช้ฟังก์ชันเชิงมุมของฉันโซลูชันนี้ช่วยฉันสองสามชั่วโมง!
อัลเลน

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

1
ฟังก์ชั่นเริ่มต้นของแท็บ hi-jacks นี้เป็นค่าเริ่มต้น หากคุณต้องทำเช่นนี้แท็บของคุณจะไม่เริ่มต้น
Archonic

2
นี่เป็นวิธีที่ 'แฮ็ค' และควรหลีกเลี่ยง
Juni Brosas

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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.