All other answers are correct. This answer will take into account the fact that one might have multiple ul.nav.nav-pills
or ul.nav.nav-tabs
on the same page. In this case, the previous answers will fail.
Still using localStorage
but with a stringified JSON
as the value. Here is the code:
$(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");
}
});
});
This bit can be used on the entire app over all pages and will work for both tabs and pills.
Also, make sure the tabs or pills are not active by default, otherwise you will see a flicker effect at page load.
Important: Make sure the parent ul
has an id. Thanks Alain