В настоящее время я использую вкладки с Twitter Bootstrap и хочу выбрать ту же вкладку после того, как пользователь отправил данные и страница перезагрузится.
Как это сделать?
Мой текущий вызов вкладок выглядит так:
<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>
Ответы:
Вам нужно будет использовать 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'); } });
источник
$(this).attr('href')
вместо того,$(e.target).attr('id')
что дает вам хеш без полного URL-адреса. Вы также должны применить.tab()
к тегу adata-toggle="tab"
вместо$('#'+lastTab)
. См. Также: stackoverflow.com/questions/16808205/…shown
Кажется, что он больше не работает, пришлось изменить его наshown.bs.tab
. Примечание: я понимаю javascript и др. Примерно так же, как разбираюсь в экономике ... так что кто-нибудь, кто знает, что происходит, пожалуйста, не стесняйтесь поправлять меня.Получил, что это работает с использованием файлов cookie, а также с удалением «активного» класса из любых других вкладок и панелей вкладок ... и добавлением «активного» класса к текущей вкладке и панели вкладок.
Я уверен, что есть способ сделать это лучше, но в данном случае он работает.
Требуется плагин 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'); } });
источник
Все остальные ответы верны. Этот ответ будет учитывать тот факт, что у одного может быть несколько
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
есть идентификатор. Спасибо Аленисточник
Для наилучшего варианта используйте такую технику:
$(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(); } });
источник
Я предпочитаю сохранять выбранную вкладку в хэш-значении окна. Это также позволяет отправлять ссылки коллегам, которые видят «ту же» страницу. Уловка состоит в том, чтобы изменить хэш местоположения при выборе другой вкладки. Если вы уже используете # на своей странице, возможно, хэш-тег должен быть разделен. В моем приложении я использую ":" в качестве разделителя значений хеш-функции.
<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>
источник
<asp:LinkButton CssClass="form-search" ID="LinkButtonSearch" runat="server">Search</asp:LinkButton>
, после нажатия на кнопку активна вкладка по умолчанию, а не текущая вкладка. как я могу это исправить ??Чтобы предотвратить мигание страницы на первой вкладке, а затем на вкладке, которая была сохранена файлом cookie (это происходит, когда вы определяете класс "активный" по умолчанию в первой вкладке)
Удалите класс "активных" вкладок и панелей, например:
<ul class="nav nav-tabs"> <div id="p1" class="tab-pane">
Поместите сценарий ниже, чтобы установить первую вкладку как по умолчанию (требуется плагин 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) { $('a[href=' + lastTab + ']').tab('show'); } else { // Set the first tab if cookie do not exist $('a[data-toggle="tab"]:first').tab('show'); } });
источник
Хотите эффект затухания? Обновленная версия кода @ Oktav:
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"); } }); });
источник
У меня были вкладки на нескольких страницах, и 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'); } })
edit: Я заметил, что мне нужно иметь разные
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'); } })
источник
Я заставил его работать с аналогичным решением, что и @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'); } });
источник
indexTab
дважды, но это разница. индекс. Так что я назову вторуюlastIndexTab
. Что касаетсяshown
, это событие, поэтому оно не сработает, пока вы не откроете вкладку, поэтому не имеет значения, было ли это раньшеgetItem
.Предлагаю следующие изменения
Используйте такой плагин, как ampify.store, который предоставляет кроссбраузерный / кроссплатформенный API локального хранилища со встроенными резервными вариантами.
Настройте таргетинг на вкладку, которую нужно сохранить,
$('#div a[data-toggle="tab"]')
чтобы расширить эту функциональность на несколько контейнеров вкладок, существующих на одной странице.Используйте уникальный идентификатор
(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'); } });
источник
Простое решение без локального хранилища:
$(".nav-tabs a").on("click", function() { location.hash = $(this).attr("href"); });
источник
Серверный подход. Убедитесь, что все элементы html имеют class = "" в случае, если не указано иное, иначе вам нужно будет обрабатывать значения 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"; } }
источник
Если вы хотите показать первую вкладку при первом входе на страницу, используйте этот код:
<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>
источник
Вот созданный мной фрагмент, который работает с 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(); } });
источник
$ (документ) .ready (функция () {
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" }); } });
});
источник
если у вас более одной вкладки на странице, вы можете использовать следующий код
<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>
источник
Это обновит вкладки, но только после того, как все в контроллере загрузится.
// >= 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'); });
источник
Я использую это с MVC:
Раздел 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> }
источник