113

我正在使用 Twitter Bootstrap 及其“标签”。

我有以下代码:

<ul class="nav nav-tabs">
    <li class="active"><a data-toggle="tab" href="#add">add</a></li>
    <li><a data-toggle="tab" href="#edit" >edit</a></li>
    <li><a data-toggle="tab" href="#delete" >delete</a></li>
</ul>

选项卡工作正常,但在 URL 中未添加#add、#edit、#delete。

当我删除data-toggleURL 更改时,但选项卡不起作用。

有什么解决方案吗?

4

15 回答 15

280

试试这个代码。它将选项卡 href 添加到 url + 基于页面加载时的哈希打开选项卡:

$(function(){
  var hash = window.location.hash;
  hash && $('ul.nav a[href="' + hash + '"]').tab('show');

  $('.nav-tabs a').click(function (e) {
    $(this).tab('show');
    var scrollmem = $('body').scrollTop() || $('html').scrollTop();
    window.location.hash = this.hash;
    $('html,body').scrollTop(scrollmem);
  });
});
于 2012-08-27T08:43:48.997 回答
49

完整的解决方案需要三个组件:

  1. 如果 URL 中有哈希,则在加载页面时显示正确的选项卡。
  2. 更改选项卡时更改 URL 中的哈希。
  3. 当 URL 中的哈希更改时更改选项卡(后退/前进按钮),并确保第一个选项卡循环正确。

我不认为这里的任何评论,也不是公认的答案,可以处理所有这些情况。

由于涉及的内容很多,我认为它作为一个小型 jQuery 插件是最简洁的:https ://github.com/aidanlister/jquery-stickytabs

您可以像这样调用插件:

$('.nav-tabs').stickyTabs();

我为此写了一篇博文,http://aidanlister.com/2014/03/persisting-the-tab-state-in-bootstrap/

于 2014-03-04T00:26:33.157 回答
30

Usingdata-toggle="tab" 要求插件处理选项卡,在执行此操作时会调用preventDefault事件(github 上的代码)。

您可以使用自己的选项卡激活,并让事件通过:

$('.nav-tabs a').click(function (e) {
    // No e.preventDefault() here
    $(this).tab('show');
});

而且您必须删除该属性data-toggle="tab"

如果您有疑问,请查看文档。

于 2012-08-26T15:59:25.713 回答
13

由于您的锚元素已经更改了 url 哈希,因此监听onhashchange事件是另一个不错的选择。正如@flori 已经提到的,此方法适用于浏览器后退按钮。

var tabs$ = $(".nav-tabs a");

$( window ).on("hashchange", function() {
    var hash = window.location.hash, // get current hash
        menu_item$ = tabs$.filter('[href="' + hash + '"]'); // get the menu element

    menu_item$.tab("show"); // call bootstrap to show the tab
}).trigger("hashchange");

最后,在定义监听器之后触发事件也将有助于在页面加载时显示正确的选项卡。

于 2013-10-03T08:24:00.273 回答
3

我对您的问题的解决方案:

首先为每个链接添加新data-value属性,如下所示:a

<ul class="nav nav-tabs">
    <li class="active">
        <a data-toggle="tab" href="#tab-add" data-value="#add">add</a>
    </li>
    <li>
        <a data-toggle="tab" href="#tab-edit" data-value="#edit">edit</a>
    </li>
    <li>
        <a data-toggle="tab" href="#tab-delete" data-value="#delete">delete</a>
    </li>
</ul>

其次,更改选项卡的 id,例如 from addto tab-add,也更新 hrefs 以包含tab-前缀:

<div class="tab-content">
    <div class="tab-pane" id="tab-add">Add panel</div>
    <div class="tab-pane" id="tab-edit">Edit panel</div>
    <div class="tab-pane" id="tab-delete">Panel panel</div>
</div>

最后是js代码:

<script type="text/javascript">
    $(function () {
        var navTabs = $('.nav-tabs a');
        var hash = window.location.hash;
        hash && navTabs.filter('[data-value="' + hash + '"]').tab('show');

        navTabs.on('shown', function (e) {
            var newhash = $(e.target).attr('data-value');
            window.location.hash = newhash;
        });
    })
</script>

这是jsFiddle - 但由于 jsFiddle 使用了 iframe,它不起作用,但您可以阅读我的解决方案的源代码。

于 2013-08-29T09:40:37.527 回答
3

带有 Bootstrap 3 选项卡的 CakePHP 也存在同样的问题,而且当我使用外部 URL 和锚点发送时,它会跳转到丢失我的菜单的部分,在查看了许多解决方案后,这...

感谢:http ://ck.kennt-wayne.de/2012/dec/twitter-bootstrap-how-to-fix-tabs

$(document).ready(function()
 {  
//Redirecciona al tab, usando un prefijo al cargar por primera vez, al usar redirect en cake #_Pagos    
//Redirecciona al tab, usando #Pagos
/* Automagically jump on good tab based on anchor; for page reloads or links */
 if(location.hash) 
  {
     $('a[href=' + location.hash + ']').tab('show');         
  }


//Para evitar el bajar al nivel del tab, (al mostrarse el tab subimos)
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) 
{
    location.hash = $(e.target).attr('href').substr(1);
    scrollTo(0,0);      
});



//Actualiza el URL con el anchor o ancla del tab al darle clic
 /* Update hash based on tab, basically restores browser default behavior to
 fix bootstrap tabs */
$(document.body).on("click", "a[data-toggle]", function(event) 
  {
    location.hash = this.getAttribute("href");
  });


//Redirecciona al tab, al usar los botones de regresar y avanzar del navegador.
/* on history back activate the tab of the location hash if exists or the default tab if no hash exists */   
$(window).on('popstate', function() 
{
  //Si se accesa al menu, se regresa al tab del perfil (activo default), fixed conflict with menu
  //var anchor = location.hash || $("a[data-toggle=tab]").first().attr("href");
  var anchor = location.hash;
  $('a[href=' + anchor + ']').tab('show');

});   

});//Fin OnReady
于 2014-10-07T17:41:41.530 回答
2

还有一种简单的方法可以对哈希更改做出反应(例如后退按钮)。只需将 hashchange 事件侦听器添加到 tomaszbak 解决方案:

$(function(){
  // Change tab on load
  var hash = window.location.hash;
  hash && $('ul.nav a[href="' + hash + '"]').tab('show');

  $('.nav-tabs a').click(function (e) {
    $(this).tab('show');
    var scrollmem = $('body').scrollTop();
    window.location.hash = this.hash;
    $('html,body').scrollTop(scrollmem);
  });

  // Change tab on hashchange
  window.addEventListener('hashchange', function() {
    var changedHash = window.location.hash;
    changedHash && $('ul.nav a[href="' + changedHash + '"]').tab('show');
  }, false);
});
于 2013-09-24T09:44:37.653 回答
2

我知道 OP 说使用 JQuery,但您可以简单地使用 vanilla JS 来做到这一点:

document.querySelectorAll('ul.nav a.nav-link').forEach(link => {
    link.onclick = () => window.history.pushState(null, null, link.attributes.href.value);
});
于 2020-05-16T07:54:28.100 回答
1

我正在使用 Bootstrap 3.3.* 并且上述解决方案都没有帮助我,甚至标记为答案一。我刚刚添加了下面的脚本并工作了。

$(function(){
    var hash = document.location.hash;
    if (hash) {
       $('.navbar-nav a[href="' + hash + '"]').tab('show');
    }
    $('a[data-toggle="tab"]').on('click', function (e) {
       history.pushState(null, null, $(this).attr('href'));
    });
});

希望这对您有所帮助。

于 2016-07-21T07:42:40.767 回答
0

最简单的,假设您使用此处data-toggle="tab"描述的文档化语法:

$(document).on('shown.bs.tab', function(event) {
  window.location.hash = $(event.target).attr('href');
});
于 2013-11-24T23:50:25.863 回答
0

对于那些使用 Ruby on Rails 或任何其他服务器端脚本的用户,您需要使用anchor路径选项。这是因为一旦页面加载,它就没有可用的 URL 哈希。您将希望通过链接或表单提交提供正确的选项卡。

<%= form_for @foo, url: foo_path(@foo, anchor: dom_id(foo)) do |f| %>
# Or
<%= link_to 'Foo', foo_path(@foo, anchor: dom_id(foo)) %>

如果您使用前缀来防止窗口跳转到 id:

<%= form_for @foo, url: foo_path(@foo, anchor: "bar_#{dom_id(foo)}") do |f| %>

然后是 CoffeeScript:

  hash = document.location.hash
  prefix = 'bar_'
  $('.nav-tabs a[href=' + hash.replace(prefix, '') + ']').tab 'show' if hash
  $('.nav-tabs a').on 'shown.bs.tab', (e) ->
    window.location.hash = e.target.hash.replace '#', '#' + prefix

或 JavaScript:

var hash, prefix;

hash = document.location.hash;
prefix = 'bar_';

if (hash) {
  $('.nav-tabs a[href=' + hash.replace(prefix, '') + ']').tab('show');
}

$('.nav-tabs a').on('shown.bs.tab', function(e) {
  window.location.hash = e.target.hash.replace('#', '#' + prefix);
});

这应该在 Bootstrap 3 中工作。

于 2014-06-05T18:07:47.313 回答
0

感谢@tomaszbak的原始解决方案,但是由于我的编辑被拒绝并且我无法对他的帖子发表评论,但我将在此处留下稍微改进且更具可读性的版本。

它基本上做同样的事情,但如果解决了我与他的跨浏览器兼容性问题。

$(document).ready(function(){
   // go to hash on window load
   var hash = window.location.hash;
   if (hash) {
       $('ul.nav a[href="' + hash + '"]').tab('show');
   }
   // change hash on click
   $('.nav-tabs a').click(function (e) {
       $(this).tab('show');
       if($('html').scrollTop()){
           var scrollmem = $('html').scrollTop(); // get scrollbar position (firefox)
       }else{
           var scrollmem = $('body').scrollTop(); // get scrollbar position (chrome)
       }
       window.location.hash = this.hash;
       $('html,body').scrollTop(scrollmem); // set scrollbar position
   });
});
于 2016-03-23T13:15:38.887 回答
0

这是一个使用选项history.pushState,您可以使用浏览器历史记录返回上一个选项卡

  $(document).ready(function() {
  // add a hash to the URL when the user clicks on a tab
  $('a[data-toggle="tab"]').on('click', function(e) {
    history.pushState(null, null, $(this).attr('href'));
  });
  // navigate to a tab when the history changes
  window.addEventListener("popstate", function(e) {
    var activeTab = $('[href=' + location.hash + ']');
    if (activeTab.length) {
      activeTab.tab('show');
    } else {
      $('.nav-tabs a:first').tab('show');
    }
  });
});
于 2016-04-11T09:03:05.610 回答
0

以上都不适合我,所以这是我的工作方式:

  1. 添加class="tab-link"到所有需要此功能的链接
  2. 将以下代码添加到您的 javascript:
    window.addEventListener
    (
        '流行状态',
        函数(事件)
        {
            tab_change();
        }
    );

    函数 tab_change()
    {
        var hash = window.location.hash;
        hash && $( 'ul.nav a[href="' + hash + '"]' ).tab( 'show' );

        $( '.tab-link' ).click
        (
            函数(e)
            {
                $( 这个 ).tab( '显示' );

                var scrollmem = $( 'body' ).scrollTop() || $('html').scrollTop();
                window.location.hash = this.hash;
                $('html,body').scrollTop(scrollmem);

                $( 'ul.nav-tabs a[href="' + window.location.hash + '"]' ).tab( 'show' );
            }
        );
    }

于 2016-06-30T16:05:07.373 回答
-2

这也修复了使用 jquery 和 bootstrap 时一个非常模糊的选项卡 a href 不触发

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 

<script type="text/javascript">
$('.nav-tabs a').click(function (e) {
    // No e.preventDefault() here.
    $(this).tab('show');
});
</script>

<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
于 2012-12-04T19:50:24.583 回答