Etkin sekme değişikliği için Bootstrap 3 jquery olayı


286

Bootstrap 3 sekmesi / navbar sekmesi değişiklikleri tam anlamıyla google tükürdü tüm önerileri yanlış / işe yaramadı bir işlevi ateş etmeye çalışırken gerçekçi olmayan bir süre geçirdim .

Bu nasıl yapılır?

Meta düzenleme: yoruma bakın


3
Bu gerçekten işe yaradı! Yalnızca belirli bir sekmeyi izlemek istiyorsak, $ ("a [href = '# tab_name']"). ('Shown.bs.tab', fn) için izleyebiliriz. a [href = '# tab_name'] benzersiz olduğu garanti edilmez.
msanjay


@rogerdpack ' stackoverflow.com/questions/13164239/… ' yönlendirmek için kafa karıştırıcı gibi görünüyor, sorgulayıcı yanlış bir yol izledi ve kapsamı içinde bir cevap aradı, soru aşırı uzun ve spesifik ve kabul edilen cevap bunu yansıtıyor gibi görünüyor çünkü bu kesinlikle sorumun cevabı değil. Bu sorunun birçok insanın muhtemelen bununla ilgili olduğu için yardımcı olmamaları.
Gerben Rampaart

Yanıtlar:


451

Eric Saupe bunu nasıl yapacağını biliyor

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


Çok teşekkürler, cevabınızı bulmadan önce bu konuda biraz zaman geçirdiniz, sallayın!
Hacat

1
Değişim olayını kullanmak zorundaysanız (bağlantıdaki eylemden bağımsız olarak), sadece şunu kullanın$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
Aline Matos

Mükemmel, bununla çok zaman kazandım!
Justin

Bunda küçük bir şüphe var. targetGlobal değişken olarak ilan ettim ve değeri yukarıda belirtildiği gibi atadım. Sayfayı ilk yüklediğimde, hedefin değerini (uyarı) tanımsız olarak alıyorum. Ancak, sekmeyi değiştirip bu değeri hedefe atadığımda herhangi bir uyarı almıyorum. Bir hata mesajı bile yok. Bu döngünün dışına çıkarmak için ne yapmalıyım? Değişkeni document.ready işlevinin dışında beyan ettim.
SSS

Bu yalnızca başka bir sekmeyi tıklarsam çalışır. Varsayılan tetikleyici için bu tetikleyici nasıl eklenir? Her sekmeye ajax yüklemem gerekiyor. Ancak bununla birlikte yalnızca başka bir sekmeyi tıklattığımda ve sonra ilkini yüklediğimde yüklenir.
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');
    }
});

sorun attr ('href') 'in asla boş olmamasıdır.

Veya #id = "#some değeri" ni karşılaştırıp ajax'ı çağırın.


Evet sadece attr ('href') asla boş bırakılmaz. Sekmenin kimliğini döndürür.
Florin

1
Anlıyorum. Herkese yaptığım yorumun 'shown.bs.tab' bitine odaklandığını düşünüyorum. Bunu takip etmekte gerçekten zorlandım.
Gerben Rampaart

1
Okok ... ekledi: boş seçici.
Gerben Rampaart

Teşekkürler. Bir cazibe gibi!
dani herrera

Teşekkürler @Florin. benim sorunum senin fonksiyon ile çözüldü. SEVMEK!
Aiyoub Amini

32

@ Gerben'in gönderisi sayesinde, dokümanlarda açıklandığı gibi show.bs.tab (sekme gösterilmeden önce) ve shown.bs.tab (sekme gösterildikten sonra) olmak üzere iki etkinlik vardır - Bootstrap Sekmesi kullanımı

Yalnızca belirli bir sekmeyle ilgileniyorsak ve belki bir işlevde if - else bloğu eklemek zorunda kalmadan ayrı işlevler ekleyebileceğimiz ek bir çözüm, bir href seçicisini kullanmaktır (gerekirse ek seçicilerle birlikte olabilir).

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

gösteri


Harika bir çözüm, tab show olayından sonra yakalamam ve açısal fonksiyonumu aramam gerekiyor, bu çözüm bana birkaç saat kazandırdı!
Allen

10

Mosh Feu cevabına eklemek için, benim durumumda olduğu gibi anında oluşturulan sekmeler aşağıdaki kodu kullanırsanız

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

});

Umarım bu birine yardım eder


8

Bu benim için çalıştı.

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

Benim için mükemmel çalışıyor.
MattD

1
Bu hi-jacks, varsayılan sekme işlevini başlatır. Bunu yapmanız gerekiyorsa, sekmeleriniz başlatılmıyor.
Archonic

2
Bu bir 'hacky' yoludur ve kaçınılmalıdır.
Juni Brosas

2

Başka bir yaklaşım kullanıyorum.

Sadece tüm bulmaya anerede idbazı başlar alt dize .

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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.