Làm cách nào để giữ tab hiện tại hoạt động với twitter bootstrap sau khi tải lại trang?


87

Tôi hiện đang sử dụng các tab với Twitter Bootstrap và muốn chọn cùng một tab sau khi người dùng đã đăng dữ liệu và trang tải lại.

Làm thế nào là điều này được thực hiện?

Lệnh gọi hiện tại của tôi đến inti các tab trông như thế này:

<script type="text/javascript">

$(document).ready(function() {

    $('#profileTabs a:first').tab('show');
});
</script>

Các tab của tôi:

<ul id="profileTabs" class="nav nav-tabs">
    <li class="active"><a href="#profile" data-toggle="tab">Profile</a></li>
    <li><a href="#about" data-toggle="tab">About Me</a></li>
    <li><a href="#match" data-toggle="tab">My Match</a></li>
</ul>

1
Đây dường như là một câu hỏi trùng lặp đối với stackoverflow.com/questions/18999501/…
koppor

Câu trả lời:


138

Bạn sẽ phải sử dụng localStorage hoặc cookie để quản lý điều đó. Đây là một giải pháp nhanh chóng và bẩn thỉu có thể được cải thiện rất nhiều, nhưng có thể cung cấp cho bạn một điểm khởi đầu:

$(function() { 
    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use 'shown' in the next line
    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
        // save the latest tab; use cookies if you like 'em better:
        localStorage.setItem('lastTab', $(this).attr('href'));
    });

    // go to the latest tab, if it exists:
    var lastTab = localStorage.getItem('lastTab');
    if (lastTab) {
        $('[href="' + lastTab + '"]').tab('show');
    }
});

tuyệt vời, giải pháp của bạn có thể được thêm vào lõi 30 của joomla, joomlacode.org/gf/project/joomla/tracker/…
Benn

12
sử dụng tốt hơn $(this).attr('href')thay vì $(e.target).attr('id')cung cấp cho bạn hàm băm mà không có url hoàn chỉnh. Bạn cũng phải áp dụng .tab()trên thẻ data-toggle="tab"thay cho $('#'+lastTab). Xem thêm: stackoverflow.com/questions/16808205/…
Bass Jobsen

3
Có vẻ như phương thức thay đổi một chút trong Bootstrap 3. shownCó vẻ như không còn hoạt động nữa, phải thay đổi nó thành shown.bs.tab. Lưu ý: Tôi hiểu về javascript và các cộng sự cũng như tôi hiểu về kinh tế học ... vì vậy ai đó biết điều gì có thể vui lòng sửa cho tôi.
Chaz,

10
Được sửa đổi để hoạt động với nhiều điều khiển tab (và Bootstrap 3): gist.github.com/brendanmckenzie/8f8008d3d51c07b2700f
Brendan

1
Nó sẽ chuyển đến tab đầu tiên và quay lại tab hiện tại sau khi làm mới
Raviteja

23

Làm cho điều này hoạt động bằng cách sử dụng cookie và cũng xóa lớp 'hoạt động' khỏi bất kỳ tab và ngăn tab nào khác ... và thêm lớp 'hoạt động' vào tab và ngăn tab hiện tại.

Tôi chắc rằng có một cách tốt hơn để làm điều này, nhưng điều này dường như hiệu quả trong trường hợp này.

Yêu cầu plugin cookie jQuery.

$(function() { 
  $('a[data-toggle="tab"]').on('shown', function(e){
    //save the latest tab using a cookie:
    $.cookie('last_tab', $(e.target).attr('href'));
  });

  //activate latest tab, if it exists:
  var lastTab = $.cookie('last_tab');
  if (lastTab) {
      $('ul.nav-tabs').children().removeClass('active');
      $('a[href='+ lastTab +']').parents('li:first').addClass('active');
      $('div.tab-content').children().removeClass('active');
      $(lastTab).addClass('active');
  }
});

Tôi không thể làm cho giải pháp localStorage hoạt động mặc dù nó có vẻ hợp lý. Giải pháp này ra khỏi hộp và plugin $ .cookie RẤT hữu ích để có.
Michael J. Calkins

áp dụng .tab () trên thẻ có data-toggle = "tab" thay vì xóa và thêm lớp, hãy xem thêm: stackoverflow.com/questions/16808205/…
Bass Jobsen

Đối với bố cục của tôi, vì tôi đang sử dụng "fade in active" cho các div, nên cần phải thay đổi hai dòng cuối cùng để thêm hoặc bớt "in active".
Obromios 17/02/16

18

Tất cả các câu trả lời khác đều đúng. Câu trả lời này sẽ tính đến thực tế là một người có thể có nhiều ul.nav.nav-pillshoặc ul.nav.nav-tabstrên cùng một trang. Trong trường hợp này, các câu trả lời trước sẽ không thành công.

Vẫn sử dụng localStoragenhưng với một JSONgiá trị được xâu chuỗi. Đây là mã:

$(function() {
  var json, tabsState;
  $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown', function(e) {
    var href, json, parentId, tabsState;

    tabsState = localStorage.getItem("tabs-state");
    json = JSON.parse(tabsState || "{}");
    parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id");
    href = $(e.target).attr('href');
    json[parentId] = href;

    return localStorage.setItem("tabs-state", JSON.stringify(json));
  });

  tabsState = localStorage.getItem("tabs-state");
  json = JSON.parse(tabsState || "{}");

  $.each(json, function(containerId, href) {
    return $("#" + containerId + " a[href=" + href + "]").tab('show');
  });

  $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() {
    var $this = $(this);
    if (!json[$this.attr("id")]) {
      return $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first").tab("show");
    }
  });
});

Bit này có thể được sử dụng trên toàn bộ ứng dụng trên tất cả các trang và sẽ hoạt động cho cả tab và viên thuốc. Ngoài ra, hãy đảm bảo rằng các tab hoặc viên thuốc không hoạt động theo mặc định , nếu không bạn sẽ thấy hiệu ứng nhấp nháy khi tải trang.

Quan trọng : Đảm bảo rằng cha mẹ ulcó một id. Cảm ơn Alain


2
Ngoài ra, đối BS3, thay thế các sự kiện 'thể hiện' với 'shown.bs.tab'
Alain

18

Để có lựa chọn tốt nhất, hãy sử dụng kỹ thuật này:

$(function() { 
  //for bootstrap 3 use 'shown.bs.tab' instead of 'shown' in the next line
  $('a[data-toggle="tab"]').on('click', function (e) {
    //save the latest tab; use cookies if you like 'em better:
    localStorage.setItem('lastTab', $(e.target).attr('href'));
  });

  //go to the latest tab, if it exists:
  var lastTab = localStorage.getItem('lastTab');

  if (lastTab) {
    $('a[href="'+lastTab+'"]').click();
  }
});

12

Tôi thích lưu trữ tab đã chọn trong giá trị băm của cửa sổ. Điều này cũng cho phép gửi liên kết đến đồng nghiệp, những người nhìn thấy trang "giống nhau". Bí quyết là thay đổi băm của vị trí khi một tab khác được chọn. Nếu bạn đã sử dụng # trong trang của mình, có thể thẻ băm phải được tách. Trong ứng dụng của mình, tôi sử dụng ":" làm dấu phân tách giá trị băm.

<ul class="nav nav-tabs" id="myTab">
    <li class="active"><a href="#home">Home</a></li>
    <li><a href="#profile">Profile</a></li>
    <li><a href="#messages">Messages</a></li>
    <li><a href="#settings">Settings</a></li>
</ul>

<div class="tab-content">
    <div class="tab-pane active" id="home">home</div>
    <div class="tab-pane" id="profile">profile</div>
    <div class="tab-pane" id="messages">messages</div>
    <div class="tab-pane" id="settings">settings</div>
</div>

<script>
    $('#myTab a').click(function (e) {
        e.preventDefault()
        $(this).tab('show')
    });

    // store the currently selected tab in the hash value
    $("ul.nav-tabs > li > a").on("shown.bs.tab", function (e) {
        var id = $(e.target).attr("href").substr(1);
        window.location.hash = id;
    });

    // on load of the page: switch to the currently selected tab
    var hash = window.location.hash;
    $('#myTab a[href="' + hash + '"]').tab('show');
</script>

Cảm ơn bạn vì câu trả lời này. Nó hoạt động tốt cho tôi và tôi không muốn xử lý cookie chỉ cho vấn đề này vì vậy nó là tuyệt vời.
nico008

@koppor, điều này không hoạt động, có một sự kiện đăng lại. Tôi đã thêm nút liên kết <asp:LinkButton CssClass="form-search" ID="LinkButtonSearch" runat="server">Search</asp:LinkButton> , sau khi nhấp vào nút, đó là tab mặc định trở nên hoạt động chứ không phải tab hiện tại. làm thế nào tôi có thể sửa chữa đó ??
Djama

6

Để ngăn trang nhấp nháy trên tab đầu tiên và sau đó là tab đã được cookie lưu (điều này xảy ra khi bạn xác định lớp "hoạt động" theo mặc định trong TAB đầu tiên)

Loại bỏ lớp "hoạt động" của các tab và ngăn như:

<ul class="nav nav-tabs">
<div id="p1" class="tab-pane">

Đặt tập lệnh bên dưới để đặt tab đầu tiên giống như mặc định (Yêu cầu plugin cookie jQuery)

    $(function() { 
        $('a[data-toggle="tab"]').on('shown', function(e){
            //save the latest tab using a cookie:
            $.cookie('last_tab', $(e.target).attr('href'));
        });
        //activate latest tab, if it exists:
        var lastTab = $.cookie('last_tab');
        if (lastTab) {
            $('a[href=' + lastTab + ']').tab('show');
        }
        else
        {
            // Set the first tab if cookie do not exist
            $('a[data-toggle="tab"]:first').tab('show');
        }
    });

3

Muốn có hiệu ứng mờ dần? Phiên bản cập nhật của mã @ Oktav:

  1. Đối với Bootstrap 3
  2. Thiết lập các lớp trên div của li và tab để cho phép fade hoạt động bình thường. Lưu ý rằng tất cả div nội dung cầnclass="tab-pane fade"

Mã:

// See http://stackoverflow.com/a/16984739/64904
// Updated by Larry to setup for fading
$(function() {
  var json, tabsState;
  $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
    var href, json, parentId, tabsState;
    tabsState = localStorage.getItem("tabs-state");
    json = JSON.parse(tabsState || "{}");
    parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id");
    href = $(e.target).attr('href');
    json[parentId] = href;
    return localStorage.setItem("tabs-state", JSON.stringify(json));
  });
  tabsState = localStorage.getItem("tabs-state");
  json = JSON.parse(tabsState || "{}");
  $.each(json, function(containerId, href) {
    var a_el = $("#" + containerId + " a[href=" + href + "]");
    $(a_el).parent().addClass("active");
    $(href).addClass("active in");
    return $(a_el).tab('show');
  });
  $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() {
    var $this = $(this);
    if (!json[$this.attr("id")]) {
      var a_el = $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first"),
          href = $(a_el).attr('href');
      $(a_el).parent().addClass("active");
      $(href).addClass("active in");
      return $(a_el).tab("show");
    }
  });
});

3

Tôi đã có các tab trong nhiều trang và localStorage cũng giữ lastTab từ các trang trước, vì vậy đối với trang tiếp theo, vì nó đã lưu trữ lastTab của trang trước, nó không tìm thấy bất kỳ tab nào phù hợp ở đây, vì vậy không có gì được hiển thị. Tôi đã sửa đổi nó theo cách này.

$(document).ready(function(){
    //console.log($('a[data-toggle="tab"]:first').tab('show'))
    $('a[data-toggle="tab"]').on('shown.bs.tab', function () {
        //save the latest tab; use cookies if you like 'em better:
        localStorage.setItem('lastTab', $(this).attr('href'));
    });

    //go to the latest tab, if it exists:
    var lastTab = localStorage.getItem('lastTab');
    if ($('a[href=' + lastTab + ']').length > 0) {
        $('a[href=' + lastTab + ']').tab('show');
    }
    else
    {
        // Set the first tab if cookie do not exist
        $('a[data-toggle="tab"]:first').tab('show');
    }
})

chỉnh sửa: Tôi nhận thấy rằng tôi sẽ phải có các lastTabtên biến khác nhau cho các trang khác nhau, nếu không, chúng sẽ luôn ghi đè lẫn nhau. ví dụ lastTab_klanten, lastTab_bestellingenv.v. cho hai trang khác nhau klantenbestellingencả hai đều có dữ liệu được hiển thị trong các tab.

$(document).ready(function(){
    //console.log($('a[data-toggle="tab"]:first').tab('show'))
    $('a[data-toggle="tab"]').on('shown.bs.tab', function () {
        //save the latest tab; use cookies if you like 'em better:
        localStorage.setItem('lastTab_klanten', $(this).attr('href'));
    });

    //go to the latest tab, if it exists:
    var lastTab_klanten = localStorage.getItem('lastTab_klanten');
    if (lastTab_klanten) {
        $('a[href=' + lastTab_klanten + ']').tab('show');
    }
    else
    {
        // Set the first tab if cookie do not exist
        $('a[data-toggle="tab"]:first').tab('show');
    }
})

3

Tôi đã làm cho nó hoạt động với giải pháp tương tự như @dgabriel, trong trường hợp này, các liên kết <a>không cần id, nó xác định tab hiện tại dựa trên vị trí.

$(function() { 
  $('a[data-toggle="tab"]').on('shown', function (e) {
    var indexTab = $('a[data-toggle="tab"]').index($(this)); // this: current tab anchor
    localStorage.setItem('lastVisitedTabIndex', indexTab);
  });

  //go to the latest tab, if it exists:
  var lastIndexTab  = localStorage.getItem('lastVisitedTabIndex');
  if (lastIndexTab) {
      $('a[data-toggle="tab"]:eq(' + lastIndexTab + ')').tab('show');
  }
});

Tôi nghĩ rằng mã của bạn sai cách vòng getItem nên được hiển thị trước khi hiển thị, cũng đặt vấn đề khai báo indexTab hai lần.
John Magnolia

@JohnMagnolia Tôi đã đặt tên indexTabhai lần nhưng khác nhau. mục lục. Vì vậy, tôi sẽ gọi cái thứ 2 lastIndexTab. Liên quan đến shown, đó là một sự kiện, vì vậy nó sẽ không kích hoạt cho đến khi bạn mở một tab, vì vậy nó không quan trọng nếu là trước đó getItem.
Jaider

1

Tôi đề nghị những thay đổi sau

  1. Sử dụng một plugin như amplify.store mà cung cấp một crossbrowser / crossplatform localStorage API với BUILTIN fallbacks.

  2. Nhắm mục tiêu tab cần được lưu $('#div a[data-toggle="tab"]')để mở rộng chức năng này cho nhiều vùng chứa tab tồn tại trên cùng một trang.

  3. Sử dụng một số nhận dạng duy nhất (url ??)để lưu và khôi phục các tab được sử dụng gần đây nhất trên nhiều trang.


$(function() { 
  $('#div a[data-toggle="tab"]').on('shown', function (e) {
    amplify.store(window.location.hostname+'last_used_tab', $(this).attr('href'));
  });

  var lastTab = amplify.store(window.location.hostname+'last_used_tab');
  if (lastTab) {
    $("#div a[href="+ lastTab +"]").tab('show');
  }
});

1

Giải pháp đơn giản mà không cần lưu trữ cục bộ:

$(".nav-tabs a").on("click", function() {
    location.hash = $(this).attr("href");
});

0

Cách tiếp cận phía máy chủ. Đảm bảo tất cả các phần tử html có class = "" trong trường hợp không được chỉ định hoặc bạn sẽ cần xử lý null.

    private void ActiveTab(HtmlGenericControl activeContent, HtmlGenericControl activeTabStrip)
    {
        if (activeContent != null && activeTabStrip != null)
        {
            // Remove active from content
            Content1.Attributes["class"] = Content1.Attributes["class"].Replace("active", "");
            Content2.Attributes["class"] = Content2.Attributes["class"].Replace("active", "");
            Content3.Attributes["class"] = Content3.Attributes["class"].Replace("active", "");

            // Remove active from tab strip
            tabStrip1.Attributes["class"] = tabStrip1.Attributes["class"].Replace("active", "");
            tabStrip2.Attributes["class"] = tabStrip2.Attributes["class"].Replace("active", "");
            tabStrip3.Attributes["class"] = tabStrip3.Attributes["class"].Replace("active", "");

            // Set only active
            activeContent.Attributes["class"] = activeContent.Attributes["class"] + " active";
            activeTabStrip.Attributes["class"] = activeTabStrip.Attributes["class"] + " active";
        }
    }

0

Nếu bạn muốn hiển thị tab đầu tiên trong lần đầu tiên bạn vào trang, hãy sử dụng mã này:

    <script type="text/javascript">
        function invokeMeMaster() {
        var chkPostBack = '<%= Page.IsPostBack ? "true" : "false" %>';
            if (chkPostBack == 'false') {
                $(function () {
                    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use 'shown' in the next line
                    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
                        // save the latest tab; use cookies if you like 'em better:
                        localStorage.setItem('lastTab', $(this).attr('href'));
                    });

                });
            }
            else {
                $(function () {

                    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use 'shown' in the next line
                    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
                        // save the latest tab; use cookies if you like 'em better:
                        localStorage.setItem('lastTab', $(this).attr('href'));
                    });

                    // go to the latest tab, if it exists:
                    var lastTab = localStorage.getItem('lastTab');
                    if (lastTab) {
                        $('[href="' + lastTab + '"]').tab('show');
                    }

                });

            }
        }
        window.onload = function() { invokeMeMaster(); };

    </script>


0

Đây là một đoạn mã mà tôi đã tạo hoạt động với Bootstrap 3jQueryvới các URL khác nhau chứa các tab khác nhau . Tuy nhiên, nó không hỗ trợ nhiều tab trên mỗi trang nhưng nó sẽ là một sửa đổi dễ dàng nếu bạn cần tính năng đó.

/**
 * Handles 'Bootstrap' package.
 *
 * @namespace bootstrap_
 */

/**
 * @var {String}
 */
var bootstrap_uri_to_tab_key = 'bootstrap_uri_to_tab';

/**
 * @return {String}
 */
function bootstrap_get_uri()
{
    return window.location.href;
}

/**
 * @return {Object}
 */
function bootstrap_load_tab_data()
{
    var uriToTab = localStorage.getItem(bootstrap_uri_to_tab_key);
    if (uriToTab) {
    try {
        uriToTab = JSON.parse(uriToTab);
        if (typeof uriToTab != 'object') {
        uriToTab = {};
        }
    } catch (err) {
        uriToTab = {};
    }
    } else {
    uriToTab = {};
    }
    return uriToTab;
}

/**
 * @param {Object} data
 */
function bootstrap_save_tab_data(data)
{
    localStorage.setItem(bootstrap_uri_to_tab_key, JSON.stringify(data));
}

/**
 * @param {String} href
 */
function bootstrap_save_tab(href)
{
    var uri = bootstrap_get_uri();
    var uriToTab = bootstrap_load_tab_data();
    uriToTab[uri] = href;
    bootstrap_save_tab_data(uriToTab);
}

/**
 *
 */
function bootstrap_restore_tab()
{
    var uri = bootstrap_get_uri();
    var uriToTab = bootstrap_load_tab_data();
    if (uriToTab.hasOwnProperty(uri) &&
    $('[href="' + uriToTab[uri] + '"]').length) {
    } else {
    uriToTab[uri] = $('a[data-toggle="tab"]:first').attr('href');
    }
    if (uriToTab[uri]) {
        $('[href="' + uriToTab[uri] + '"]').tab('show');
    }
}

$(document).ready(function() {

    if ($('.nav-tabs').length) {

    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use 'shown' in the next line
    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
        bootstrap_save_tab($(this).attr('href'));
    });
    bootstrap_restore_tab();

    }

});

0

$ (tài liệu) .ready (function () {

        if (JSON.parse(localStorage.getItem('currentClass')) == "active")
        {
            jQuery('#supporttbl').addClass('active')
            $('.sub-menu').css({ "display": "block" });
        }

        $("#supporttbl").click(function () { 
            var currentClass;
            if ($(this).attr('class')== "active") { 

                currentClass = $(this).attr('class');

                localStorage.setItem('currentClass', JSON.stringify(currentClass));
                console.log(JSON.parse(localStorage.getItem('currentClass')));

                jQuery('#supporttbl').addClass('active')
                $('.sub-menu').css({ "display": "block" });

            } else {

                currentClass = "Null"; 

                localStorage.setItem('currentClass', JSON.stringify(currentClass));
                console.log(JSON.parse(localStorage.getItem('currentClass')));

                jQuery('#supporttbl').removeClass('active')
                $('.sub-menu').css({ "display": "none" });

            }  
        });

});


0

nếu bạn có nhiều tab trong trang, bạn có thể sử dụng mã sau

<script type="text/javascript">
$(document).ready(function(){
    $('#profileTabs').on('show.bs.tab', function(e) {
        localStorage.setItem('profileactiveTab', $(e.target).attr('href'));
    });
    var profileactiveTab = localStorage.getItem('profileactiveTab');
    if(profileactiveTab){
        $('#profileTabs a[href="' + profileactiveTab + '"]').tab('show');        
    }
    $('#charts-tab').on('show.bs.tab', function(e) {
        localStorage.setItem('chartsactiveTab', $(e.target).attr('href'));
    });
    var chartsactiveTab = localStorage.getItem('chartsactiveTab');
    if(chartsactiveTab){
        $('#charts-tab a[href="' + chartsactiveTab + '"]').tab('show');        
    }     
});
</script>

0

Thao tác này sẽ làm mới các tab nhưng chỉ sau khi mọi thứ trong bộ điều khiển được tải.

// >= angular 1.6 angular.element(function () {
angular.element(document).ready(function () {
    //Here your view content is fully loaded !!
    $('li[href="' + location.hash + '"] a').tab('show');
});

0

Tôi đang sử dụng cái này với MVC:

  • Có một trường số nguyên SelectedTab trong mô hình để gửi giá trị đến phương thức POST

Phần JavaScript:

<script type="text/javascript">
    $(document).ready(function () {
       var index = $("input#SelectedTab").val();
       $("#tabstrip > ul li:eq(" + index + ")").addClass("k-state-active");

       $("#tabstrip").kendoTabStrip();
    });
    function setTab(index) {
      $("input#SelectedTab").val(index)
    }
</script>

Phần HTML:

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.SelectedTab)
<div id="tabstrip">
    <ul>
        <li onclick="setTab(0)">Content 0</li>
        <li onclick="setTab(1)">Content 1</li>
        <li onclick="setTab(2)">Content 2</li>
        <li onclick="setTab(3)">Content 3</li>
        <li onclick="setTab(4)">Content 4</li>
    </ul>
    <div>

    </div>
    <div>

    </div>
    <div>

    </div>
    <div>

    </div>
    <div>

    </div>
</div>
<div class="content">
    <button type="submit" name="save" class="btn bg-blue">Save</button>
</div>
}
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.