Evento jquery de inicialização 3 para alteração de guia ativa

286

Passei uma quantidade irreal de tempo tentando disparar uma função quando a guia muda da guia bootstrap 3 / navbar e literalmente todas as sugestões que o google cuspiu estavam erradas / não funcionaram.

Como fazer isso?

Meta-edição: ver comentário

Gerben Rampaart
fonte
3
Isso foi realmente útil! Se quisermos observar apenas uma guia específica, podemos observar $ ("a [href = '# tab_name']"). On ('showing.bs.tab', fn) É claro que podemos especificar mais seletores se não é garantido que [href = '# tab_name'] seja único.
msanjay
O @rogerdpack ' stackoverflow.com/questions/13164239/… ' parece confuso para redirecionar, o questionador seguiu um caminho errado e procurou uma resposta dentro do escopo, a pergunta é excessivamente longa e específica e a resposta aceita parece refletir isso porque certamente não é a resposta válida para minha pergunta. O fato de esta pergunta não ter ajudado tantas pessoas provavelmente está relacionado a isso.
Gerben Rampaart

Respostas:

451

Eric Saupe sabe como fazê-lo

$('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
fonte
Muito obrigado, gastou bastante tempo nisso antes de encontrar sua resposta, você é demais!
Hajja
1
Se você tem que usar o evento de alteração (independentemente da ação do link), basta usar$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
Aline Matos
Perfeito, me poupou muito tempo com isso!
23716 Justin
Eu tenho uma pequena dúvida nisso. Declarei o targetcomo variável global e atribuí o valor como mencionado acima. Quando carrego a página pela primeira vez, recebo o valor (alerta) do destino como indefinido. Mas, quando altero a guia e atribuo esse valor ao destino, não estou recebendo nenhum alerta. Nem mesmo uma mensagem de erro. O que devo fazer para trazê-lo para fora desse loop? Eu declarei a variável fora da função document.ready.
SSS
Isso funciona apenas se eu clicar em outra guia. Como adicionar esse gatilho para a guia padrão? Eu preciso carregar o ajax em todas as guias. Mas com isso, ele carrega apenas quando clico em outra guia e depois na primeira novamente.
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');
    }
});

o problema é que attr ('href') nunca está vazio.

Ou para comparar o #id = "#some value" e chame o ajax.

Florim
fonte
Sim é apenas attr ('href') nunca está vazio. Retorna o ID da guia.
Florin
1
Compreendo. Eu acho que meu comentário para todos focados no bit 'mostrado.bs.tab'. Eu tive muita dificuldade em rastrear isso.
Gerben Rampaart
1
Okok ... adicionou: seletor vazio.
Gerben Rampaart
Obrigado. Como um encanto!
Dani herrera
Obrigado @Florin. meu problema foi resolvido com sua função. GOSTAR!
Aiyoub Amini
32

Graças à postagem de @ Gerben, soube que existem dois eventos show.bs.tab (antes da exibição da guia) e shows.bs.tab (após a exibição da guia), conforme explicado nos documentos - Uso da guia Bootstrap

Uma solução adicional, se estivermos interessados ​​apenas em uma guia específica e talvez adicionar funções separadas sem precisar adicionar um bloco if - else em uma função, é usar o seletor a href (talvez junto com seletores adicionais, se necessário)

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

demonstração

msanjay
fonte
Ótima solução, eu preciso pegar o evento tab show e chamar a minha função angular, essa solução me salvou algumas horas!
Allen
10

Para adicionar à resposta do Mosh Feu, se as guias foram criadas em tempo real, como no meu caso, você usaria o seguinte código

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

});

Espero que isso ajude alguém

Jaylen
fonte
8

Isso funcionou para mim.

$('.nav-pills > li > a').click( function() {
    $('.nav-pills > li.active').removeClass('active');
    $(this).parent().addClass('active');
} );
Patrick D Rittenhouse
fonte
Funciona perfeitamente para mim.
MattD
1
Esse oi-jack inicia a funcionalidade da guia padrão. Se você precisar fazer isso, suas guias não serão inicializadas.
Archonic
2
Esta é uma maneira 'hacky' e deve ser evitada.
Juni Brosas
2

Eu uso outra abordagem.

Apenas tente encontrar tudo de aonde idcomeça a partir de alguma 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>
Desenvolvedor
fonte