Sự kiện jquery Bootstrap 3 để thay đổi tab hoạt động


286

Tôi đã dành một lượng thời gian không thực tế để cố gắng kích hoạt một chức năng khi tab thay đổi của tab bootstrap 3 / thanh điều hướng và theo nghĩa đen, tất cả các đề xuất google spat out đều sai / không hoạt động.

Làm thế nào để đi về điều này?

Chỉnh sửa meta: xem bình luận


3
Điều này thực sự hữu ích! Nếu chúng tôi chỉ muốn coi chừng một tab cụ thể, chúng tôi có thể xem $ ("a [href = '# tab_name']"). On ('shows.bs.tab', fn) Tất nhiên chúng tôi có thể chỉ định các công cụ chọn tiếp theo nếu [href = '# tab_name'] không được đảm bảo là duy nhất.
msanjay


@rogerdpack ' stackoverflow.com/questions/13164239/ cấp ' có vẻ khó hiểu khi chuyển hướng đến, người hỏi đã đi sai đường và tìm câu trả lời trong phạm vi của nó, câu hỏi quá dài và cụ thể và câu trả lời được chấp nhận phản ánh điều đó bởi vì nó chắc chắn không phải là câu trả lời hợp lệ cho câu hỏi của tôi Thực tế câu hỏi này không giúp được gì vì nhiều người có lẽ liên quan đến điều đó.
Gerben Rampaart

Câu trả lời:


451

Eric Saupe biết cách làm điều đó

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


Cảm ơn rất nhiều, đã dành khá nhiều thời gian cho việc này trước khi tìm thấy câu trả lời của bạn, bạn rock!
Hajjat

1
Nếu bạn phải sử dụng sự kiện thay đổi (bất kể hành động từ liên kết), chỉ cần sử dụng$(document).on('shown.bs.tab', function (e) { console.log('ae'); });
Aline Matos

Hoàn hảo, tiết kiệm cho tôi rất nhiều thời gian với điều này!
Justin

Tôi có một nghi ngờ nhỏ trong việc này. Tôi đã khai báo targetlà biến toàn cục và gán giá trị như đã đề cập ở trên. Khi tôi tải trang lần đầu tiên, tôi nhận được giá trị (cảnh báo) của mục tiêu là không xác định. Nhưng, khi tôi thay đổi tab và gán giá trị đó cho mục tiêu, tôi sẽ không nhận được bất kỳ cảnh báo nào. Thậm chí không có một thông báo lỗi. Tôi nên làm gì để đưa nó ra ngoài vòng lặp đó? Tôi đã khai báo biến ngoài hàm document. Yet.
SSS

Điều này chỉ hoạt động nếu tôi nhấp vào tab khác. Làm thế nào để thêm kích hoạt cho tab mặc định? Tôi cần tải ajax trên mỗi tab. Nhưng với điều này, nó chỉ tải khi tôi nhấp vào tab khác và sau đó lần đầu tiên.
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');
    }
});

vấn đề là attr ('href') không bao giờ trống.

Hoặc để so sánh giá trị #id = "#some" và sau đó gọi ajax.


Có chỉ là attr ('href') không bao giờ là emplty. Nó trả về id của tab.
Florin

1
Tôi hiểu. Tôi nghĩ rằng nhận xét của tôi cho mọi người tập trung vào bit 'shows.bs.tab'. Tôi đã có một thời gian thực sự khó khăn để theo dõi xuống.
Gerben Rampaart

1
Okok ... đã thêm: bộ chọn trống.
Gerben Rampaart

Cảm ơn. Giống như một sự quyến rũ!
dani herrera

Cảm ơn bạn @Florin. vấn đề của tôi được giải quyết với chức năng của bạn. GIỐNG!
Aiyoub Amini

32

Nhờ bài đăng của @ Gerben biết rằng có hai sự kiện show.bs.tab (trước khi tab được hiển thị) và shows.bs.tab (sau khi tab được hiển thị) như được giải thích trong tài liệu - Sử dụng Tab Bootstrap

Một giải pháp bổ sung nếu chúng tôi chỉ quan tâm đến một tab cụ thể và có thể thêm các chức năng riêng biệt mà không phải thêm khối if - khác trong một chức năng, là sử dụng bộ chọn a href (có thể cùng với bộ chọn bổ sung nếu được yêu cầu)

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

bản giới thiệu


Giải pháp tuyệt vời, tôi cần nắm bắt sau khi hiển thị sự kiện tab và gọi đến chức năng góc của tôi, giải pháp này đã giúp tôi tiết kiệm được vài giờ!
Allen

10

Để thêm vào câu trả lời của Mosh Feu, nếu các tab được tạo nhanh như trong trường hợp của tôi, bạn sẽ sử dụng mã sau đây

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

});

tôi hi vọng điêu nay se giup được ai đo


8

Điều này làm việc cho tôi.

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

Hoạt động hoàn hảo cho tôi.
MattD

1
Chức năng tab mặc định hi-jacks bootstraps này. Nếu bạn phải làm điều này, các tab của bạn không được khởi tạo.
Archonic

2
Đây là một cách 'hacky' và nên tránh.
Juni Brosas

2

Tôi sử dụng một cách tiếp cận khác.

Chỉ cần cố gắng tìm tất cả anơi idbắt đầu từ một số chuỗi con .

Mã não

$('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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.