Bootstrap 3 jquery event untuk perubahan tab aktif

286

Saya menghabiskan jumlah waktu yang tidak realistis untuk mencoba menjalankan suatu fungsi ketika perubahan tab pada bootstrap 3 tab / navbar dan secara harfiah semua saran yang dikeluarkan Google salah / tidak berfungsi.

Bagaimana caranya?

Meta-edit: lihat komentar

Gerben Rampaart
sumber
3
Ini sangat berguna! Jika kami hanya ingin menonton untuk tab tertentu, kami dapat menonton untuk $ ("a [href = '# tab_name']"). Pada ('diperlihatkan.bs.tab', fn) Tentu saja kami dapat menentukan pemilih lebih lanjut jika a [href = '# tab_name'] tidak dijamin unik.
msanjay
@rogerdpack ' stackoverflow.com/questions/13164239/... ' tampaknya membingungkan untuk dialihkan ke, penanya mengambil jalur yang salah dan mencari jawaban di dalam cakupannya, pertanyaannya terlalu panjang dan spesifik dan jawaban yang diterima tampaknya mencerminkan hal itu karena tentu bukan jawaban yang valid untuk pertanyaan saya. Fakta pertanyaan ini tidak membantu karena banyak orang mungkin terkait dengan itu.
Gerben Rampaart

Jawaban:

451

Eric Saupe tahu bagaimana melakukannya

$('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>

Gerben Rampaart
sumber
Terima kasih banyak, menghabiskan cukup banyak waktu untuk ini sebelum menemukan jawaban Anda, dasar!
Hajjat
1
Jika Anda harus menggunakan acara perubahan (terlepas dari tindakan dari tautan), cukup gunakan$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
Aline Matos
Sempurna, menyelamatkan saya banyak waktu dengan ini!
Justin
Saya memiliki sedikit keraguan dalam hal ini. Saya mendeklarasikan targetsebagai variabel global dan memberikan nilai seperti yang disebutkan di atas. Ketika saya pertama kali memuat halaman, saya mendapatkan nilai (peringatan) dari target sebagai tidak terdefinisi. Tapi, ketika saya mengubah tab dan menetapkan nilai itu ke target, saya tidak mendapatkan peringatan apa pun. Bahkan tidak ada pesan kesalahan. Apa yang harus saya lakukan, untuk membawanya ke luar lingkaran itu? Saya sudah mendeklarasikan variabel di luar dokumen. Sudah berfungsi.
SSS
Ini hanya berfungsi jika saya mengklik tab lain. Bagaimana cara menambahkan pemicu itu untuk tab default? Saya perlu memuat ajax di setiap tab. Tetapi dengan ini hanya memuat ketika saya mengklik tab lain dan kemudian yang pertama lagi.
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');
    }
});

masalahnya adalah bahwa attr ('href') tidak pernah kosong.

Atau untuk membandingkan nilai #id = "#some" dan panggil ajax.

Florin
sumber
Ya itu hanya attr ('href') tidak pernah kosong. Ini mengembalikan id tab.
Florin
1
Saya mengerti. Saya pikir komentar saya kepada semua orang terfokus pada bit 'ditampilkan.bs.tab'. Saya mengalami kesulitan melacaknya.
Gerben Rampaart
1
Okok ... ditambahkan: pemilih kosong.
Gerben Rampaart
Terima kasih. Seperti pesona!
dani herrera
@Florin terima kasih. masalah saya terpecahkan dengan fungsi Anda. SUKA!
Aiyoub Amini
32

Berkat pos @ Gerben, diketahui ada dua acara show.bs.tab (sebelum tab ditampilkan) dan diperlihatkan.bs.tab (setelah tab ditampilkan) seperti yang dijelaskan dalam dokumen - Bootstrap Tab digunakan

Solusi tambahan jika kami hanya tertarik pada tab tertentu, dan mungkin menambahkan fungsi terpisah tanpa harus menambahkan jika - blok lain dalam satu fungsi, adalah dengan menggunakan pemilih href (mungkin bersama dengan pemilih tambahan jika diperlukan)

 $("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');
 });

demo

msanjay
sumber
Solusi hebat, saya perlu menangkap setelah acara tab show dan memanggil ke fungsi sudut saya, solusi ini menyelamatkan saya beberapa jam!
Allen
10

Untuk menambahkan jawaban Mosh Feu, jika tab tempat dibuat dengan cepat seperti dalam kasus saya, Anda akan menggunakan kode berikut

$(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');
    }

});

Saya harap ini membantu seseorang

Jaylen
sumber
8

Ini berhasil untuk saya.

$('.nav-pills > li > a').click( function() {
    $('.nav-pills > li.active').removeClass('active');
    $(this).parent().addClass('active');
} );
Patrick D Rittenhouse
sumber
Berfungsi sempurna untuk saya.
MattD
1
Hi-jack ini mem-bootstraps fungsionalitas tab default. Jika Anda harus melakukan ini, tab Anda tidak diinisialisasi.
Archonic
2
Ini adalah cara 'retas' dan harus dihindari.
Juni Brosas
2

Saya menggunakan pendekatan lain.

Coba saja cari semua atempat idmulai dari beberapa substring .

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>
Pengembang
sumber