Bootstrap 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文本。
黑暗骑士

Answers:


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');
肖恩·亚当斯Hiett

12
不幸的是,当您单击浏览器时,浏览器跳到了选项卡内容。设置window.location.hash值时,这是默认行为。一种替代方法可能是使用push.state,但您需要针对IE <= 9的polyfill。欲了解更多的相关信息和其他替代解决方案,看看stackoverflow.com/questions/3870057/...
菲利普·迈克尔

3
当我们单击元素时,有什么方法可以防止“假滚动”到相关ID?
Patrice Poliquin

1
滚动是由于分配给选项卡页的ID。如果您使用语义ID并处理哈希(即添加前缀/后缀),它将不会被识别为有效ID,也不会滚动。以此扩展答案。
亚历克斯·马扎里奥尔

1
@koppor,它可以工作,但是当我直接跳到另一个保存的选项卡(通过链接)时,它会在跳转到链接中的选项卡之前大约1秒钟快速显示主页选项卡或第一个选项卡。标签,因为它不需要?
mboy19年

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

1
我认为将选择器更改"a[data-toggle=tab]"为更好。现在,选择器的编写方式还可以在单​​击链接(例如,打开模式)时更改浏览器URL。
leifdenby

5
您可能要在选择器上添加字符串括号,例如'a [href =“'+ location.hash +'”]'。偶然发现语法错误。
asdacap '16

1
按原样使用此方法会与Bootstrap下拉菜单(data-toggle="dropdown"在同一情况下使用和我碰巧在同一页上带有选项卡的冲突。像在这里建议的人一样,只需替换$(document.body).on("click", "a[data-toggle]", function(event) {一下$(document.body).on("click", "a[data-toggle='tab']", function(event) {就可以了)
Jiveman

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
我尝试过的最佳解决方案很多。跳到选项卡上的内容很烦人
kentor

4
答案的内容跳转仍然存在
shazyriver

2
出色的解决方案:复制,粘贴并享用午餐。真好
Gary Stanton

1
有史以来最好的解决方案
幸运的是,

19

Xavi的代码完全可以正常工作。但是,当导航到另一个页面,提交表单,然后使用我的标签页重定向到该页面时,根本不会加载已保存的标签页。

使用localStorage进行救援(略更改了Nguyen的代码):

$('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
这是金!它甚至适用于模态!好答案。
LechOsiński17年

2
此代码很棒,如果您希望即使用户离开站点(结束会话)并稍后再返回时也希望该选项卡保持选中状态,则该代码非常有用。要使选择仅在当前会话期间持续存在并返回到下一个会话的默认选项卡,请将“ localStorage”的两个实例替换为“ sessionStorage”。
Gary.Ray

总之,甜,复制/粘贴的解决方案,以引导4的伟大工程
CFP支持

哇,很棒的解决方案!
Jilani A

1
[data-toggle="pill"]
mxmissile

12

这个使用HTML5 localStorage存储活动标签

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

参考: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 '16

这很好,优点是它不会引入“ window.location.hash”向URL中的http请求参数添加哈希值而引起冲突和其他http请求读取的错误参数(例如分页等
。– Dung

4

对提供的答案立足自己哈维·马丁内斯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...
});

XaviMartí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 .attr()方法显示新选项卡时,以上示例中的jQuery代码仅获取元素的href属性值,然后通过HTML5 localStorage对象将其保存在用户浏览器中。稍后,当用户刷新页面时,它将检索此数据并通过.tab('show')方法激活相关的选项卡。

寻找一些例子?这是给你们的一个.. https://jsfiddle.net/Wineson123/brseabdr/

希望我的回答对您有所帮助。:)


2

由于我无法发表评论,因此我从上面复制了答案,这确实帮了我大忙。但是我将其更改为使用Cookie而不是#id,因此我想分享所做的更改。这样,可以将活动选项卡的存储时间长于一次刷新(例如,多次重定向)或当ID已被使用并且您不想实现koppors split方法时。

<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

我尝试了XaviMartínez提供的代码。它有效,但不适用于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 '16

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>

Viewbag应该只包含页面/元素的ID,例如:“ testing”

我创建了一个site.js并将脚本添加到页面上:

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

现在,您要做的就是将ID添加到导航栏中。例如。:

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

全部欢呼data属性:)


0

除了XaviMartínez的答案,还可以避免点击次数跳升

避免跳跃

$(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”)。trigger('click');


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');删除。这个脚本。
Hasib Kamal '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.