Bootstrap 3 evento jquery per cambio scheda attivo


286

Ho trascorso una quantità non realistica di tempo cercando di attivare una funzione quando la scheda cambia della scheda / navbar bootstrap 3 e letteralmente tutti i suggerimenti che Google ha sputato erano sbagliati / non funzionavano.

Come procedere?

Meta-modifica: vedi commento


3
Questo è stato davvero utile! Se vogliamo fare attenzione solo per una scheda specifica, possiamo guardare per $ ("a [href = '# tab_name']"). On ('shows.bs.tab', fn) Naturalmente possiamo specificare ulteriori selettori se a [href = '# tab_name'] non è garantito per essere univoco.
msanjay,


@rogerdpack ' stackoverflow.com/questions/13164239/... ' un po 'confusa per reindirizzare a, è interlocutore ha preso una strada sbagliata e cercò una risposta all'interno del suo campo di applicazione, la domanda è troppo lungo e specifico e la risposta accettato sembra riflettere che, a causa non è certamente la risposta valida alla mia domanda. Il fatto che questa domanda non abbia aiutato come molte persone probabilmente è correlato a questo.
Gerben Rampaart,

Risposte:


451

Eric Saupe sa come farlo

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


Grazie mille, ho trascorso un bel po 'di tempo su questo prima di trovare la tua risposta, rock!
Hajjat,

1
Se devi usare l'evento change (indipendentemente dall'azione dal link), usa semplicemente$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
Aline Matos

Perfetto, mi ha fatto risparmiare un sacco di tempo con questo!
Giustino,

Ho un piccolo dubbio in questo. Ho dichiarato il targetcome una variabile globale e assegnato il valore come indicato sopra. Quando carico la pagina per la prima volta, ottengo il valore (avviso) di destinazione come non definito. Ma, quando cambio scheda e assegno quel valore al target, non ricevo alcun avviso. Neanche un messaggio di errore. Cosa devo fare per portarlo fuori da quel ciclo? Ho dichiarato la variabile al di fuori della funzione document.ready.
SSS,

Funziona solo se faccio clic su un'altra scheda. Come aggiungere quel trigger per la scheda predefinita? Devo caricare Ajax su ogni scheda. Ma con questo si carica solo quando faccio clic su un'altra scheda e poi di nuovo la prima.
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');
    }
});

il problema è che attr ('href') non è mai vuoto.

Oppure per confrontare #id = "#some value" e quindi chiamare ajax.


Sì è solo attr ('href') non è mai vuoto. Restituisce l'id della scheda.
Florin,

1
Capisco. Penso che il mio commento a tutti sia incentrato sul bit "shows.bs.tab". Ho avuto davvero difficoltà a rintracciarlo.
Gerben Rampaart,

1
Okok ... aggiunto: selettore vuoto.
Gerben Rampaart,

Grazie. A meraviglia!
dani herrera l'

Grazie @Florin. il mio problema è risolto con la tua funzione. PIACE!
Aiyoub Amini,

32

Grazie al post di @ Gerben è venuto a sapere che ci sono due eventi show.bs.tab (prima che la scheda sia mostrata) e shows.bs.tab (dopo che la scheda è mostrata) come spiegato nei documenti - Uso della scheda Bootstrap

Un'ulteriore soluzione se siamo interessati solo a una scheda specifica e forse aggiungiamo funzioni separate senza dover aggiungere un blocco if - else in una funzione, è utilizzare il selettore a href (magari insieme a selettori aggiuntivi se necessario)

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

dimostrazione


Ottima soluzione, devo catturare l'evento tab show e chiamare la mia funzione angolare, questa soluzione mi ha fatto risparmiare un paio d'ore!
Allen

10

Per aggiungere alla risposta Mosh Feu, se le schede sono state create al volo come nel mio caso, useresti il ​​seguente codice

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

});

Spero che questo aiuti qualcuno


8

Questo ha funzionato per me.

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

Funziona perfettamente per me.
MattD,

1
Questo hi-jack avvia la funzionalità della scheda predefinita. Se devi farlo, le tue schede non si stanno inizializzando.
Archonic,

2
Questo è un modo "confuso" e dovrebbe essere evitato.
Juni Brosas,

2

Uso un altro approccio.

Prova a trovare tutto da adove idparte da una sottostringa .

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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.