Bootstrap 3 jquery событие для активной смены вкладок

286

Я потратил нереально много времени, пытаясь запустить функцию, когда изменения вкладок на вкладке / навигационной панели начальной загрузки 3 и буквально все предложения, которые выложил Google, были неправильными / не работали.

Как это сделать?

Мета-редактирование: см. Комментарий

Гербен Рампаарт
источник
3
Это было действительно полезно! Если мы хотим следить только за конкретной вкладкой, мы можем наблюдать за $ ("a [href = '# tab_name']"). On ('seen.bs.tab', fn). Конечно, мы можем указать дополнительные селекторы, если [href = '# tab_name'] не обязательно будет уникальным.
мсанджай
@rogerdpack ' stackoverflow.com/questions/13164239/… ', кажется, сбивает с толку перенаправление, его спрашивающий выбрал неверный путь и искал ответ в своей области, вопрос слишком длинный и конкретный, и принятый ответ, кажется, отражает это, потому что это, конечно, не правильный ответ на мой вопрос. Тот факт, что этот вопрос не помог так много людей, вероятно, связано с этим.
Гербен Рампаарт

Ответы:

451

Эрик Саупе знает, как это сделать

$('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
Отлично, сэкономил мне много времени с этим!
Джастин
У меня есть небольшое сомнение в этом. Я объявил targetглобальную переменную и присвоил значение, как указано выше. Когда я впервые загружаю страницу, я получаю значение (оповещение) цели как неопределенное. Но когда я изменяю вкладку и назначаю это значение цели, я не получаю никаких предупреждений. Даже не сообщение об ошибке. Что я должен сделать, чтобы вывести это из этого цикла? Я объявил переменную вне функции document.ready.
SSS
Это работает, только если я нажму на другую вкладку. Как добавить этот триггер для вкладки по умолчанию? Мне нужно загрузить AJAX на каждой вкладке. Но при этом он загружается только когда я нажимаю другую вкладку, а затем снова снова.
Карлис Янисельс
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') никогда не бывает пустым. Возвращает идентификатор вкладки.
Флорин
1
Я понимаю. Я думаю, что мой комментарий для всех был сосредоточен на бите «show.bs.tab». Мне было очень трудно отследить это.
Гербен Рампаарт
1
Окок ... добавлено: пустой селектор.
Гербен Рампаарт
Спасибо. Как колдовство!
Дани Эррера
Спасибо @Florin. Моя проблема решена с вашей функцией. ЛАЙК!
Аиюб Амини
32

Благодаря сообщению @ Gerben стало известно, что есть два события show.bs.tab (до показа вкладки) и show.bs.tab (после показа вкладки), как объяснено в документации - Использование вкладки Bootstrap

Дополнительным решением, если мы заинтересованы только в конкретной вкладке и, возможно, добавляем отдельные функции без необходимости добавлять блок 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');
 });

демонстрация

msanjay
источник
Отличное решение, мне нужно отлавливать после события табуляции и вызова моей угловой функции, это решение сэкономило мне пару часов!
Аллен
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');
    }

});

Я надеюсь, что это поможет кому-то

Jaylen
источник
8

Это сработало для меня.

$('.nav-pills > li > a').click( function() {
    $('.nav-pills > li.active').removeClass('active');
    $(this).parent().addClass('active');
} );
Патрик Д Риттенхаус
источник
У меня отлично работает.
MattD
1
Это привет-джеки загружает функциональность вкладки по умолчанию. Если вам нужно сделать это, ваши вкладки не инициализируются.
Archonic
2
Это «хакерский» способ, и его следует избегать.
Юни Брозас
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>
разработчик
источник