Завантажувальна програма 3: Тримайте вибрану вкладку на оновленні сторінки


120

Я намагаюся підтримувати вибрану вкладку під час оновлення за допомогою Bootstrap 3 . Спробував і перевірив, з якого питання вже задавались, але для мене жодної роботи. Не знаю, де я помиляюся. Ось мій код

HTML

<!-- tabs link -->
<ul class="nav nav-tabs" id="rowTab">
    <li class="active"><a href="#personal-info" data-toggle="tab">Personal Information</a></li>
    <li><a href="#Employment-info" data-toggle="tab">Employment Information</a></li>
    <li><a href="#career-path" data-toggle="tab">Career Path</a></li>
    <li><a href="#warnings" data-toggle="tab">Warning</a></li>
</ul>
<!-- end: tabs link -->

<div class="tab-content">
    <div class="tab-pane active" id="personal-info">
        tab data here...
    </div>

    <div class="tab-pane" id="Employment-info">
        tab data here...
    </div>

    <div class="tab-pane" id="career-path">
        tab data here...
    </div>

    <div class="tab-pane" id="warnings">
        tab data here...
    </div>
</div>

Javascript :

// tab
$('#rowTab a:first').tab('show');

//for bootstrap 3 use 'shown.bs.tab' instead of '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('selectedTab', $(e.target).attr('id'));
});

//go to the latest tab, if it exists:
var selectedTab = localStorage.getItem('selectedTab');
if (selectedTab) {
  $('#'+selectedTab).tab('show');
}

Причина не працює в тому, що вона не зберігає вибрану вкладку. Коли я зробив console.log("selectedTab::"+selectedTab);, я отримав: selectedTab::undefined. Тож застосована вами логіка не правильна
Темний лицар,

Тож чи можете ви, будь ласка, вказувати мені, що мені робити?
коханець коду

Я намагаюся це виправити. Якщо я це зробити, я опублікую тут відповідь для вас
Темний лицар,

Я вдячний за це ... дякую за допомогу ..
Коханець кодексу

Я думаю, це спрацює: jsbin.com/UNuYoHE/2/edit . Якщо це все-таки дасть мені знати, то я опублікую відповідь чітко. Ви також можете побачити тексти вкладки «div». вони не дають належної відповіді, коли ви клацаєте на них. Наприклад, якщо натиснути tab4, ви отримаєте текст tab1.
Темний лицар

Відповіді:


187

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

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

JavaScript, повинен бути вбудований після вищезазначеного в <script>...</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');

У розділі сценаріїв слід додати крапку з двокрапкою до кінця e.preventDefault();та$(this).tab('show');
Шон Адамс-Хіетт

12
На жаль, при натисканні на нього браузер переходить до вмісту вкладки. Це поведінка за замовчуванням, коли ви встановлюєте значення window.location.hash. Альтернативою може бути використання push.state, але для IE вам потрібна поліфаза заповнення <= 9. Щоб отримати більше інформації та інших альтернативних рішень, подивіться на stackoverflow.com/questions/3870057/…
Philipp Michael

3
Чи є якийсь спосіб запобігти "підробці прокрутки" до відповідного ідентифікатора, коли ми натискаємо на елемент?
Патріс Полікін

1
Прокрутка відбувається через ідентифікатор, призначений сторінкам вкладок. Якщо ви використовуєте семантичні ідентифікатори та обробляєте хеш (тобто додайте префікс / суфікс), він не буде розпізнаний як дійсний ідентифікатор, і прокрутка не відбудеться. Розширимо відповідь на це.
Алекс Мацаріол

1
@koppor це працює, але коли я переходжу безпосередньо на іншу збережену вкладку (за посиланням), вона відображає домашню вкладку або першу вкладку швидко приблизно за 1 секунду, перш ніж вона переходить на вкладку у посиланні. Будь-яка ідея запобігти появі першої вкладка, оскільки вона не потрібна?
mboy

135

Це найкраще, що я спробував:

$(document).ready(function() {
    if (location.hash) {
        $("a[href='" + location.hash + "']").tab("show");
    }
    $(document.body).on("click", "a[data-toggle='tab']", function(event) {
        location.hash = this.getAttribute("href");
    });
});
$(window).on("popstate", function() {
    var anchor = location.hash || $("a[data-toggle='tab']").first().attr("href");
    $("a[href='" + anchor + "']").tab("show");
});

20
Це працює краще, ніж прийняте рішення (Під кращим чином я маю на увазі: копіювати та вставляти твори: D)
Кирило Дюшон-Доріс

3
найкраща копія та вставка коли-небудь: P
Ghostff

1
Я думаю, що змінити селектор на "a[data-toggle=tab]"краще. Спосіб написання селектора тепер також змінює URL-адресу браузера при натисканні на посилання, щоб, наприклад, відкрити модальний.
leifdenby

5
Ви можете додати дужку рядків у селектор, наприклад, "a [href =" '+ location.hash +' "] '. Натрапили на синтаксичну помилку.
asdacap

1
Використання цього як- data-toggle="dropdown"небудь $(document.body).on("click", "a[data-toggle]", function(event) {$(document.body).on("click", "a[data-toggle='tab']", function(event) {
суперечить спадам

44

Відповідь між іншими відповідає:

  • Немає стрибка на клацання
  • Збережіть на хеші розташування
  • Збережіть на localStorage (наприклад: для надсилання форми)
  • Просто скопіюйте та вставте;)

    if (location.hash) {
      $('a[href=\'' + location.hash + '\']').tab('show');
    }
    var activeTab = localStorage.getItem('activeTab');
    if (activeTab) {
      $('a[href="' + activeTab + '"]').tab('show');
    }
    
    $('body').on('click', 'a[data-toggle=\'tab\']', function (e) {
      e.preventDefault()
      var tab_name = this.getAttribute('href')
      if (history.pushState) {
        history.pushState(null, null, tab_name)
      }
      else {
        location.hash = tab_name
      }
      localStorage.setItem('activeTab', tab_name)
    
      $(this).tab('show');
      return false;
    });
    $(window).on('popstate', function () {
      var anchor = location.hash ||
        $('a[data-toggle=\'tab\']').first().attr('href');
      $('a[href=\'' + anchor + '\']').tab('show');
    });

1
Сором я спробував спочатку інші рішення - це найкраще працює!
tdc

2
Найкраще рішення, яке я пробував від багатьох різних.
Перехід

4
Зміст стрибка все ще є з цією відповіддю
shazyriver

2
Відмінне рішення: Скопіюйте, вставте, йдіть на обід. Приємно.
Gary Stanton

1
Найкраще рішення
щасливий

19

Код Хаві майже повністю працював. Але під час переходу на іншу сторінку, подання форми, а потім перенаправлення на сторінку своїми вкладками взагалі не завантажується збереженою вкладкою.

localStorage на допомогу (трохи змінив код Нгуєна):

$('a[data-toggle="tab"]').click(function (e) {
    e.preventDefault();
    $(this).tab('show');
});

$('a[data-toggle="tab"]').on("shown.bs.tab", function (e) {
    var id = $(e.target).attr("href");
    localStorage.setItem('selectedTab', id)
});

var selectedTab = localStorage.getItem('selectedTab');
if (selectedTab != null) {
    $('a[data-toggle="tab"][href="' + selectedTab + '"]').tab('show');
}

2
Це золото! Це працює навіть з модалами! Чудова відповідь.
Lech Osiński

2
Цей код є фантастичним і чудово працює, якщо ви хочете, щоб вкладка залишалася вибраною, навіть якщо користувач покидає сайт (закінчує сеанс) і повертається пізніше. Щоб вибір зберігався лише протягом поточного сеансу і повертався до вкладки за замовчуванням на наступному сеансі, замініть два екземпляри "localStorage" на "sessionStorage".
Gary.Ray

Коротке, солодке рішення для копіювання / вставки, яке чудово працює з Bootstrap 4.
Підтримка CFP

Вау приголомшливе рішення!
Jilani A

1
[data-toggle="pill"]для таблеток
mxmissle

12

Для використання localStorageактивної вкладки використовується HTML5

$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
    localStorage.setItem('activeTab', $(e.target).attr('href'));
});
var activeTab = localStorage.getItem('activeTab');
if (activeTab) {
   $('#navtab-container a[href="' + activeTab + '"]').tab('show');
}

ref: http://www.tutorialrepublic.com/faq/how-to-keep-the-current-tab-active-on-page-reload-in-bootstrap.php https://www.w3schools.com/bootstrap /bootstrap_ref_js_tab.asp


це приємно, але недоліком є ​​те, що ви не зможете поділитися посиланнями з активною вкладкою
lfender6445

це приємно, перевага полягає в тому, що він не вводить питання, де "window.location.hash" додає хеш-значення до http-парам-запиту в URL-адресі, викликаючи зіткнення та поганий парам, прочитаний іншими http-запитами, такими як пагінація тощо,
Dung

4

Опираючись на відповіді, надані Xavi Martínez та koppor, я придумав рішення, яке використовує хеш URL-адрес або localStorage залежно від наявності останнього:

function rememberTabSelection(tabPaneSelector, useHash) {
    var key = 'selectedTabFor' + tabPaneSelector;
    if(get(key)) 
        $(tabPaneSelector).find('a[href=' + get(key) + ']').tab('show');

    $(tabPaneSelector).on("click", 'a[data-toggle]', function(event) {
        set(key, this.getAttribute('href'));
    }); 

    function get(key) {
        return useHash ? location.hash: localStorage.getItem(key);
    }

    function set(key, value){
        if(useHash)
            location.hash = value;
        else
            localStorage.setItem(key, value);
    }
}

Використання:

$(document).ready(function () {
    rememberTabSelection('#rowTab', !localStorage);
    // Do Work...
});

Це не в курсі кнопки "назад", як це стосується рішення Xavi Martínez .


4

Мій код, він працює для мене, я використовую localStorageHTML5

$('#tabHistory  a').click(function(e) {
  e.preventDefault();
  $(this).tab('show');
});
$("ul.nav-tabs#tabHistory > li > a").on("shown.bs.tab", function(e) {
  var id = $(e.target).attr("href");
  localStorage.setItem('selectedTab', id)
});
var selectedTab = localStorage.getItem('selectedTab');
$('#tabHistory a[href="' + selectedTab + '"]').tab('show');

4

Я спробував це, і це працює: (Будь ласка, замініть це на таблетку або вкладку, яку ви використовуєте)

    jQuery(document).ready(function() {
        jQuery('a[data-toggle="pill"]').on('show.bs.tab', function(e) {
            localStorage.setItem('activeTab', jQuery(e.target).attr('href'));
        });

        // Here, save the index to which the tab corresponds. You can see it 
        // in the chrome dev tool.
        var activeTab = localStorage.getItem('activeTab');

        // In the console you will be shown the tab where you made the last 
        // click and the save to "activeTab". I leave the console for you to 
        // see. And when you refresh the browser, the last one where you 
        // clicked will be active.
        console.log(activeTab);

        if (activeTab) {
           jQuery('a[href="' + activeTab + '"]').tab('show');
        }
    });

Я сподіваюся, що це комусь допоможе.

Ось результат: https://jsfiddle.net/neilbannet/ego1ncr5/5/


4

Що ж, це вже в 2018 році, але я думаю, що краще пізно, ніж ніколи (як назва в телепрограмі), хаха. Тут розташований код jQuery, який я створюю під час своєї дипломної роботи.

<script type="text/javascript">
$(document).ready(function(){
    $('a[data-toggle="tab"]').on('show.affectedDiv.tab', function(e) {
        localStorage.setItem('activeTab', $(e.target).attr('href'));
    });
    var activeTab = localStorage.getItem('activeTab');
    if(activeTab){
        $('#myTab a[href="' + activeTab + '"]').tab('show');
    }
});
</script>

і ось код для вкладок завантаження:

<div class="affectedDiv">
    <ul class="nav nav-tabs" id="myTab">
        <li class="active"><a data-toggle="tab" href="#sectionA">Section A</a></li>
        <li><a data-toggle="tab" href="#sectionB">Section B</a></li>
        <li><a data-toggle="tab" href="#sectionC">Section C</a></li>
    </ul>
    <div class="tab-content">
        <div id="sectionA" class="tab-pane fade in active">
            <h3>Section A</h3>
            <p>Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui. Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth.</p>
        </div>
        <div id="sectionB" class="tab-pane fade">
            <h3>Section B</h3>
            <p>Vestibulum nec erat eu nulla rhoncus fringilla ut non neque. Vivamus nibh urna, ornare id gravida ut, mollis a magna. Aliquam porttitor condimentum nisi, eu viverra ipsum porta ut. Nam hendrerit bibendum turpis, sed molestie mi fermentum id. Aenean volutpat velit sem. Sed consequat ante in rutrum convallis. Nunc facilisis leo at faucibus adipiscing.</p>
        </div>
        <div id="sectionC" class="tab-pane fade">
            <h3>Section C</h3>
            <p>Vestibulum nec erat eu nulla rhoncus fringilla ut non neque. Vivamus nibh urna, ornare id gravida ut, mollis a magna. Aliquam porttitor condimentum nisi, eu viverra ipsum porta ut. Nam hendrerit bibendum turpis, sed molestie mi fermentum id. Aenean volutpat velit sem. Sed consequat ante in rutrum convallis. Nunc facilisis leo at faucibus adipiscing.</p>
        </div>
    </div>
</div>


Не забувайте називати завантажувальний інструмент та інші основні речі 

ось швидкі коди для вас:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>


Тепер давайте до пояснення:

Код jQuery у наведеному вище прикладі просто отримує значення атрибута href елемента, коли нова вкладка була показана методом jQuery .attr () та зберігає її локально у браузері користувача через HTML5 об’єкт localStorage. Пізніше, коли користувач оновлює сторінку, він отримує ці дані та активує відповідну вкладку методом .tab ('show').

Шукаєте приклади? ось один для вас, хлопці .. https://jsfiddle.net/Wineson123/brseabdr/

Я хочу, щоб моя відповідь могла допомогти вам усім. :)


2

Оскільки я ще не можу коментувати, я скопіював відповідь зверху, це дійсно допомогло мені. Але я змінив його на роботу з файлами cookie замість #id, тому хотів поділитися змінами. Це дозволяє зберігати активну вкладку довше, ніж лише одне оновлення (наприклад, багаторазове переадресація) або коли ідентифікатор вже використовується, і ви не хочете реалізувати метод розділення koppors.

<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);
    $.cookie('activeTab', id);
});

    // on load of the page: switch to the currently selected tab
    var hash = $.cookie('activeTab');
    if (hash != null) {
        $('#myTab a[href="#' + hash + '"]').tab('show');
    }
</script>

Дякуємо за оновлення. Насправді я шукав таку резолюцію, але за той час, коли я хотів, я отримав лише відповідь @koppor як такий, що працює. Насправді це один із чудових способів, якщо ми хочемо використовувати функцію "назад". Дякуємо за оновлення
любитель коду

2

Я спробував код, запропонований Хаві Мартінес . Він працював, але не для IE7. Проблема полягає в тому, що вкладки не посилаються на будь-який відповідний вміст.
Отже, я віддаю перевагу цьому коду для вирішення цієї проблеми.

function pageLoad() {
  $(document).ready(function() {

    var tabCookieName = "ui-tabs-1"; //cookie name
    var location = $.cookie(tabCookieName); //take tab's href

    if (location) {
      $('#Tabs a[href="' + location + '"]').tab('show'); //activate tab
    }

    $('#Tabs a').click(function(e) {
      e.preventDefault()
      $(this).tab('show')
    })

    //when content is alredy shown - event activate 
    $('#Tabs a').on('shown.bs.tab', function(e) {
      location = e.target.hash; // take current href
      $.cookie(tabCookieName, location, {
        path: '/'
      }); //write href in cookie
    })
  });
};

це приємно, але недоліком є ​​те, що ви не зможете поділитися посиланнями з активною вкладкою
lfender6445

1

Дякую, що поділились.

Читаючи всі рішення. Я придумав рішення, яке використовує хеш URL-адреси або localStorage залежно від наявності останнього з кодом нижче:

$(function(){
    $(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) {
        localStorage.setItem('activeTab', $(e.target).attr('href'));
    })

    var hash = window.location.hash;
    var activeTab = localStorage.getItem('activeTab');

    if(hash){
          $('#project-tabs  a[href="' + hash + '"]').tab('show');   
    }else if (activeTab){
        $('#project-tabs a[href="' + activeTab + '"]').tab('show');
    }
});

1

Для Bootstrap v4.3.1. Спробуйте нижче:

$(document).ready(function() {
    var pathname = window.location.pathname; //get the path of current page
    $('.navbar-nav > li > a[href="'+pathname+'"]').parent().addClass('active');
})

0

За допомогою html5 я приготував цей:

Дещо на сторінці:

<h2 id="heading" data-activetab="@ViewBag.activetab">Some random text</h2>

Мішок перегляду повинен просто містити ідентифікатор сторінки / елемента, наприклад: "тестування"

Я створив site.js і додав сценарій на сторінку:

/// <reference path="../jquery-2.1.0.js" />
$(document).ready(
  function() {
    var setactive = $("#heading").data("activetab");
    var a = $('#' + setactive).addClass("active");
  }
)

Тепер все, що вам потрібно зробити, - це додати свої ідентифікатори до вашого панелі навігації. Напр .:

<ul class="nav navbar-nav">
  <li **id="testing" **>
    @Html.ActionLink("Lalala", "MyAction", "MyController")
  </li>
</ul>

Усі вітають атрибут даних :)


0

Окрім відповіді Хаві Мартінеса, уникаючи стрибка на клацання

Уникнення стрибка

$(document).ready(function(){

    // show active tab

    if(location.hash) {

        $('a[href=' + location.hash + ']').tab('show');
    }

    // set hash on click without jumb

    $(document.body).on("click", "a[data-toggle]", function(e) {

        e.preventDefault();

        if(history.pushState) {

            history.pushState(null, null, this.getAttribute("href"));
        }
        else {

            location.hash = this.getAttribute("href");
        }

        $('a[href=' + location.hash + ']').tab('show');

        return false;
    });
});

// set hash on popstate

$(window).on('popstate', function() {

    var anchor = location.hash || $("a[data-toggle=tab]").first().attr("href");

    $('a[href=' + anchor + ']').tab('show');
});

Вкладені вкладки

реалізація з символом "_" як роздільник

$(document).ready(function(){

    // show active tab

    if(location.hash) {

        var tabs = location.hash.substring(1).split('_');

        $.each(tabs,function(n){

            $('a[href=#' + tabs[n] + ']').tab('show');
        });         

        $('a[href=' + location.hash + ']').tab('show');
    }

    // set hash on click without jumb

    $(document.body).on("click", "a[data-toggle]", function(e) {

        e.preventDefault();

        if(history.pushState) {

            history.pushState(null, null, this.getAttribute("href"));
        }
        else {

            location.hash = this.getAttribute("href");
        }

        var tabs = location.hash.substring(1).split('_');

        //console.log(tabs);

        $.each(tabs,function(n){

            $('a[href=#' + tabs[n] + ']').tab('show');
        });

        $('a[href=' + location.hash + ']').tab('show');

        return false;
    });
});

// set hash on popstate

$(window).on('popstate', function() {

    var anchor = location.hash || $("a[data-toggle=tab]").first().attr("href");

    var tabs = anchor.substring(1).split('_');

    $.each(tabs,function(n){

        $('a[href=#' + tabs[n] + ']').tab('show');
    });

    $('a[href=' + anchor + ']').tab('show');
});

0

Ми використовували тригер jquery для завантаження, щоб сценарій натиснув кнопку

$ (".. class_name"). тригер ("клацання");


0

Горе, так багато способів це зробити. Я придумав це, коротке і просте. Сподіваюся, що це допоможе іншим.

  var url = document.location.toString();
  if (url.match('#')) {
    $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
  } 

  $('.nav-tabs a').on('shown.bs.tab', function (e) {
    window.location.hash = e.target.hash;
    if(e.target.hash == "#activity"){
      $('.nano').nanoScroller();
    }
  })

0

Є рішення після перезавантаження сторінки та збереження очікуваної вкладки як обраної.

Припустимо, після збереження даних перенаправлена ​​URL-адреса: my_url # tab_2

Тепер через наступний сценарій очікувана вкладка залишиться обраною.

$(document).ready(function(){
    var url = document.location.toString();
    if (url.match('#')) {
        $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
        $('.nav-tabs a').removeClass('active');
    }
});

Там активний клас автоматично присвоюється тегу прив’язки, для цього він видаляється за допомогою $ ('. Nav-tabs a'). RemoveClass ('active'); цей сценарій.
Хасіб Камал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.