Як зберегти поточну вкладку активною за допомогою завантажувального ретранслятора після перезавантаження сторінки?


87

Зараз я використовую вкладки з Twitter Bootstrap і хочу вибрати ту саму вкладку після того, як користувач опублікує дані та сторінку перезавантажить.

Як це робиться?

Мій поточний дзвінок до вкладки inti виглядає так:

<script type="text/javascript">

$(document).ready(function() {

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

Мої вкладки:

<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
Це , як видається, дублює питання stackoverflow.com/questions/18999501 / ...
koppor

Відповіді:


138

Для управління вам доведеться використовувати localStorage або файли cookie. Ось швидке та брудне рішення, яке можна значно покращити, але може дати вам вихідну точку:

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

приємно, ваше рішення може бути додано до ядра joomla 30, joomlacode.org/gf/project/joomla/tracker/…
Бенн,

12
краще використовувати, $(this).attr('href')замість $(e.target).attr('id')чого дає хеш без повної URL-адреси. Ви також повинні застосувати .tab()на тегу data-toggle="tab"замість $('#'+lastTab). Дивіться також: stackoverflow.com/questions/16808205 / ...
Bass Jobsen

3
Схоже, метод трохи змінюється в Bootstrap 3., shownсхоже, більше не працює, довелося змінити його на shown.bs.tab. Примітка: Я розумію javascript та ін., Як і економіку ... тому хтось, хто знає, що сталося, не соромтеся виправити мене.
Чаз

10
Змінено для роботи з декількома елементами керування вкладками (і Bootstrap 3): gist.github.com/brendanmckenzie/8f8008d3d51c07b2700f
Брендан,

1
Він переходить до першої вкладки і повертається до поточної вкладки після оновлення
Raviteja

23

Отримав це для роботи з використанням файлів cookie, а також видалення класу "active" з будь-яких інших вкладок та панелей вкладок ... і додавання класу "active" до поточної вкладки та панелі вкладок.

Я впевнений, що існує кращий спосіб це зробити, але, схоже, це спрацьовує у цьому випадку.

Потрібен плагін 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');
  }
});

Я не зміг змусити рішення localStorage запрацювати, хоча це здавалося логічним. Це рішення нестандартно та плагін $ .cookie ДУЖЕ зручно мати.
Michael J. Calkins

застосовувати .tab () на тег з даними-тумблер = «вкладки» замість видалення і додавання класів см також: stackoverflow.com/questions/16808205 / ...
Bass Jobsen

Для мого макета, оскільки я використовував "зникати в активному" для div, потрібно було змінити останні два рядки, щоб додати або видалити "в активному".
Оброміос

18

Усі інші відповіді правильні. Ця відповідь враховуватиме той факт, що їх може бути декілька ul.nav.nav-pillsабо ul.nav.nav-tabsна одній сторінці. У цьому випадку попередні відповіді не дадуть результатів.

Все ще використовується, localStorageале зі JSONзначенням, яке має значення. Ось код:

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

Цей біт можна використовувати в усьому додатку на всіх сторінках і буде працювати як для вкладок, так і для таблеток. Також переконайтеся, що вкладки або таблетки не активовані за замовчуванням , інакше ви побачите ефект мерехтіння при завантаженні сторінки.

Важливо : Переконайтесь, що батько ulмає ідентифікатор. Дякую Ален


2
Крім того, для BS3 замініть подію 'показаний' на 'показано.bs.tab'
Ален

18

Для найкращого варіанту скористайтеся такою технікою:

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

Я вважаю за краще зберігати вибрану вкладку в хеш-значення вікна. Це також дозволяє надсилати посилання колегам, які бачать "ту саму" сторінку. Фокус полягає у зміні хешу розташування, коли вибрано іншу вкладку. Якщо ви вже використовуєте # на своїй сторінці, можливо, хеш-тег потрібно розділити. У своєму додатку я використовую ":" як роздільник хеш-значень.

<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>

Дякую за цю відповідь. Для мене це чудово працює, і я не хотів мати справу з файлами cookie лише для цієї проблеми, тому це чудово.
nico008

@koppor, це не працює, є подія зворотного зв'язку. я додав кнопку посилання <asp:LinkButton CssClass="form-search" ID="LinkButtonSearch" runat="server">Search</asp:LinkButton> , після натискання кнопки саме вкладка за замовчуванням стає активною, а не поточна. як я можу це виправити ??
Джама,

6

Щоб запобігти миготінню сторінки на першій вкладці, а потім на вкладці, яка була збережена файлом cookie (це відбувається, коли ти визначаєш клас "активний" за замовчуванням у першій вкладці)

Видаліть клас "активний" вкладок та панелей, наприклад:

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

Помістіть сценарій нижче, щоб встановити першу вкладку, як за замовчуванням (Потрібен плагін 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

Хочете ефект згасання? Оновлена ​​версія коду @ Oktav:

  1. Для Bootstrap 3
  2. Налаштовує класи на div і lib табуляції для належної роботи зникання. Зверніть увагу, що потрібні всі div вмістуclass="tab-pane fade"

Код:

// 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

У мене були вкладки на декількох сторінках, і localStorage зберігає lastTab і з попередніх сторінок, тому для наступної сторінки, оскільки вона зберігала lastTab попередньої сторінки, він не знайшов тут жодної відповідної вкладки, тому нічого не відображалося. Я модифікував його таким чином.

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

редагувати: я помітив, що мені доведеться мати різні lastTabімена змінних для різних сторінок, інакше вони завжди перезапишуть одне одного. наприклад lastTab_klanten, lastTab_bestellingenтощо для двох різних сторінок klantenі bestellingenобох, що мають дані, що відображаються на вкладках.

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

Я зробив це працює з подібним рішенням, як @dgabriel, у цьому випадку посилання <a>не потрібні id, він ідентифікує поточну вкладку залежно від позиції.

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

Я думаю, що ваш код неправильний, навколо getItem повинен бути перед показаним, а також ставить питання про оголошення оголошення indexTab двічі.
Джон Магнолія

@JohnMagnolia Я назвав indexTabдвічі, але різниця. індекс. Тож я зателефоную 2-муlastIndexTab . Що стосується shown, це подія, тому вона не спрацює, поки ви не відкриєте вкладку, тому не має значення, чи це було раніше getItem.
Jaider

1

Я пропоную наступні зміни

  1. Використовуйте такий плагін, як amplify.store, який надає API локального сховища для кросбраузера / кросплатформи із вбудованими резервними версіями.

  2. Націліть вкладку, яку потрібно зберегти, таким $('#div a[data-toggle="tab"]')чином, щоб розширити цю функціональність на кілька контейнерів вкладок, що існують на одній сторінці.

  3. Використовуйте унікальний ідентифікатор (url ??)для збереження та відновлення останніх використаних вкладок на кількох сторінках.


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


0

Підхід на стороні сервера. Переконайтеся, що всі елементи html мають class = "", якщо це не вказано, або вам потрібно буде обробляти нулі.

    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

Якщо ви хочете показати першу вкладку під час першого входу на сторінку, використовуйте цей код:

    <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

Ось фрагмент, який я зробив, який працює з Bootstrap 3 та jQuery та з різними URL-адресами, що містять різні вкладки . Хоча він не підтримує кілька вкладок на сторінці, але це повинна бути легка модифікація, якщо вам потрібна ця функція.

/**
 * 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

$ (документ) .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

якщо у вас є більше однієї вкладки на сторінці, ви можете використовувати наступний код

<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

Це оновить вкладки, але лише після того, як все в контролері буде завантажено.

// >= 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

Я використовую це з MVC:

  • У моделі є ціле поле SelectedTab для передачі значення методу POST

Розділ 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>

Розділ 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>
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.