Obecnie używam zakładek z Twitter Bootstrap i chcę wybrać tę samą kartę po opublikowaniu przez użytkownika danych i ponownym załadowaniu strony.
Jak to się robi?
Moje obecne wezwanie do inti zakładek wygląda następująco:
<script type="text/javascript">
$(document).ready(function() {
$('#profileTabs a:first').tab('show');
});
</script>
Moje zakładki:
<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>
Odpowiedzi:
Aby to zrobić, będziesz musiał użyć localStorage lub plików cookie. Oto szybkie i brudne rozwiązanie, które można znacznie ulepszyć, ale może dać punkt wyjścia:
$(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'); } });
źródło
$(this).attr('href')
zamiast tego$(e.target).attr('id')
daje hash bez pełnego adresu URL. Musisz również umieścić.tab()
na tagu zdata-toggle="tab"
zamiast$('#'+lastTab)
. Zobacz też: stackoverflow.com/questions/16808205/…shown
Nie wydaje się już działać, musiałem ją zmienić nashown.bs.tab
. Uwaga: rozumiem javascript i in. Na temat ekonomii, a także rozumiem ekonomię ... więc ktoś, kto wie, o co chodzi, może mnie poprawić.To działa przy użyciu plików cookie, a także usuwa „aktywną” klasę z innych kart i paneli kart ... i dodaje klasę „aktywną” do bieżącej karty i panelu kart.
Jestem pewien, że istnieje lepszy sposób, aby to zrobić, ale w tym przypadku wydaje się, że działa.
Wymaga wtyczki jQuery cookie.
$(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'); } });
źródło
Wszystkie inne odpowiedzi są prawidłowe. Ta odpowiedź będzie uwzględniać fakt, że można mieć wiele stron
ul.nav.nav-pills
lubul.nav.nav-tabs
na tej samej stronie. W takim przypadku poprzednie odpowiedzi zawiodą.Nadal używam,
localStorage
ale z wartością stringifiedJSON
. Oto kod:$(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"); } }); });
Tego bitu można używać w całej aplikacji na wszystkich stronach i będzie działać zarówno w przypadku kart, jak i tabletek. Upewnij się także, że karty lub pigułki nie są domyślnie aktywne , w przeciwnym razie zobaczysz efekt migotania podczas ładowania strony.
Ważne : upewnij się, że rodzic
ul
ma identyfikator. Dzięki Alainźródło
Aby uzyskać najlepszą opcję, użyj tej techniki:
$(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(); } });
źródło
Wolę przechowywać wybraną kartę w wartości skrótu okna. Umożliwia to również wysyłanie linków do współpracowników, którzy niż widzą „tę samą” stronę. Sztuczka polega na zmianie skrótu lokalizacji po wybraniu innej karty. Jeśli używasz już znaku # na swojej stronie, prawdopodobnie tag hash musi zostać podzielony. W mojej aplikacji używam znaku „:” jako separatora wartości skrótu.
<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>
źródło
<asp:LinkButton CssClass="form-search" ID="LinkButtonSearch" runat="server">Search</asp:LinkButton>
, po kliknięciu na przycisk aktywna jest zakładka domyślna, a nie aktualna. jak mogę to naprawić?Aby zapobiec miganiu strony na pierwszej karcie, a następnie na karcie, która została zapisana przez plik cookie (dzieje się tak, gdy określisz klasę jako „aktywną” domyślnie w pierwszej zakładce)
Usuń klasę „aktywną” z kart i okienek, takich jak:
<ul class="nav nav-tabs"> <div id="p1" class="tab-pane">
Umieść poniższy skrypt, aby ustawić pierwszą kartę jako domyślną (wymaga wtyczki 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'); } });
źródło
Chcesz efekt blaknięcia? Zaktualizowana wersja kodu @ Oktav:
class="tab-pane fade"
Kod:
// 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"); } }); });
źródło
Miałem karty na wielu stronach, a localStorage zachowuje również lastTab z poprzednich stron, więc na następnej stronie, ponieważ miała ostatnią kartę poprzedniej strony w pamięci, nie znalazłem tutaj żadnej pasującej karty, więc nic nie było wyświetlane. Zmodyfikowałem to w ten sposób.
$(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'); } })
edycja: Zauważyłem, że będę musiał mieć różne
lastTab
nazwy zmiennych dla różnych stron, w przeciwnym razie zawsze będą się nadpisywać. na przykładlastTab_klanten
,lastTab_bestellingen
itd. dla dwóch różnych stronklanten
ibestellingen
obie o danych wyświetlanych w zakładkach.$(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'); } })
źródło
Zrobiłem to działa z podobnym rozwiązaniem jak @dgabriel, w tym przypadku linki
<a>
nie potrzebująid
, identyfikują bieżącą kartę na podstawie pozycji.$(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'); } });
źródło
indexTab
dwa razy, ale jest to różnica. indeks. Więc zadzwonię do drugiegolastIndexTab
. Jeśli chodzi o toshown
, jest to zdarzenie, więc nie zostanie wywołane, dopóki nie otworzysz karty, więc nie ma znaczenia, czy było wcześniejgetItem
.Proponuję następujące zmiany
Użyj wtyczki, takiej jak amplify.store, która zapewnia interfejs API dla crossbrowser / crossplatform localstorage z wbudowanymi funkcjami awaryjnymi.
Skieruj na kartę, która ma zostać zapisana
$('#div a[data-toggle="tab"]')
, aby rozszerzyć tę funkcjonalność na wiele kontenerów kart, które istnieją na tej samej stronie.Użyj unikalnego identyfikatora,
(url ??)
aby zapisać i przywrócić ostatnio używane karty na wielu stronach.$(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'); } });
źródło
Proste rozwiązanie bez lokalnej pamięci:
$(".nav-tabs a").on("click", function() { location.hash = $(this).attr("href"); });
źródło
Podejście po stronie serwera. Upewnij się, że wszystkie elementy html mają class = "" w przypadku, gdy nie został określony, w przeciwnym razie będziesz musiał obsługiwać wartości 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"; } }
źródło
Jeśli chcesz, aby pierwsza zakładka była wyświetlana przy pierwszym wejściu na stronę, użyj tego kodu:
<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>
źródło
Oto utworzony przeze mnie fragment kodu, który działa z Bootstrap 3 i jQuery oraz z różnymi adresami URL zawierającymi różne karty . Nie obsługuje jednak wielu zakładek na stronie, ale powinna być łatwą modyfikacją, jeśli potrzebujesz tej funkcji.
/** * 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(); } });
źródło
$ (document) .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" }); } });
});
źródło
jeśli masz więcej niż jedną kartę na stronie, możesz użyć następującego kodu
<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>
źródło
Spowoduje to odświeżenie zakładek, ale dopiero po załadowaniu wszystkiego w kontrolerze.
// >= 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'); });
źródło
Używam tego z MVC:
Sekcja 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>
Sekcja 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> }
źródło