Twitter Bootstrap选项卡:转到页面重新加载或超链接上的特定选项卡

时间:2011-10-22 20:00:46

标签: javascript html tabs twitter-bootstrap

我正在开发一个网页,其中我正在使用Twitter的Bootstrap框架及其Bootstrap Tabs JS。除了一些小问题外,它的效果很好,其中一个是我不知道如何从外部链接直接转到特定的选项卡。例如:

<a href="facility.php#home">Home</a>
<a href="facility.php#notes">Notes</a>
当点击外部网页上的链接时,

应分别转到“主页”选项卡和“备注”选项卡

24 个答案:

答案 0 :(得分:550)

这是我对这个问题的解决方案,也许有点晚了。但它可能有助于其他人:

// Javascript to enable link to tab
var url = document.location.toString();
if (url.match('#')) {
    $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
} 

// Change hash for page-reload
$('.nav-tabs a').on('shown.bs.tab', function (e) {
    window.location.hash = e.target.hash;
})

答案 1 :(得分:206)

<强>更新

对于Bootstrap 3,将.on('shown', ...)更改为.on('shown.bs.tab', ....)


这是基于@dubbe回答和SO accepted answer。它处理window.scrollTo(0,0)无法正常工作的问题。问题是,当您在显示的选项卡上替换url hash时,浏览器将滚动到该哈希,因为它是页面上的元素。要解决此问题,请添加前缀,以便哈希不引用实际的页面元素

// Javascript to enable link to tab
var hash = document.location.hash;
var prefix = "tab_";
if (hash) {
    $('.nav-tabs a[href="'+hash.replace(prefix,"")+'"]').tab('show');
} 

// Change hash for page-reload
$('.nav-tabs a').on('shown', function (e) {
    window.location.hash = e.target.hash.replace("#", "#" + prefix);
});

使用示例

如果您的标签窗格中包含id =“mytab”,则需要输入以下链接:

<a href="yoursite.com/#tab_mytab">Go to Specific Tab </a>

答案 2 :(得分:49)

您可以在相应的标签链接上触发click事件:

$(document).ready(function(){

  if(window.location.hash != "") {
      $('a[href="' + window.location.hash + '"]').click()
  }

});

答案 3 :(得分:42)

这是dubbe解决方案的改进实现,可防止滚动。

// Javascript to enable link to tab
var url = document.location.toString();
if (url.match('#')) {
    $('.nav-tabs a[href="#'+url.split('#')[1]+'"]').tab('show') ;
} 

// With HTML5 history API, we can easily prevent scrolling!
$('.nav-tabs a').on('shown.bs.tab', function (e) {
    if(history.pushState) {
        history.pushState(null, null, e.target.hash); 
    } else {
        window.location.hash = e.target.hash; //Polyfill for old browsers
    }
})

答案 4 :(得分:18)

虽然提供的JavaScript解决方案可能有效,但我采用了稍微不同的方式,不需要额外的JavaScript,但在视图中需要逻辑。您可以使用标准URL参数创建链接,例如:

<a href = "http://link.to.yourpage?activeTab=home">My Link</a>

然后你只需检测activeTab的值,在相应的<li>

中写'class =“active”'

伪代码(用您的语言相应地实现)。注意如果本例中没有提供参数,我将'home'选项卡设置为默认激活。

$activetabhome = (params.activeTab is null or params.activeTab == 'home') ? 'class="active"' : '';
$activetabprofile = (params.activeTab == 'profile') ? 'class="active"' : '';

<li $activetabhome><a href="#home">Home</a></li>
<li $activetabprofile><a href="#profile">Profile</a></li>

答案 5 :(得分:10)

对于Bootstrap 3:

$('.nav-tabs a[href="#' + tabID + '"]').tab('show');

https://jsfiddle.net/DTcHh/6638/

答案 6 :(得分:9)

如果......别的话我不是很喜欢;所以我采取了一种更简单的方法。

$(document).ready(function(event) {
    $('ul.nav.nav-tabs a:first').tab('show'); // Select first tab
    $('ul.nav.nav-tabs a[href="'+ window.location.hash+ '"]').tab('show'); // Select tab by name if provided in location hash
    $('ul.nav.nav-tabs a[data-toggle="tab"]').on('shown', function (event) {    // Update the location hash to current tab
        window.location.hash= event.target.hash;
    })
});
  1. 选择默认标签(通常是第一个)
  2. 切换到标签(如果这样的元素确实存在;让jQuery处理它);如果指定了错误的哈希,则不会发生任何事情
  3. [可选]如果手动选择其他选项卡,则更新哈希
  4. 不解决滚动到请求的哈希;但是应该呢?

答案 7 :(得分:7)

这适用于Bootstrap 3,并通过集成GarciaWebDev的答案来改进dubbe和flynfish的2个最佳答案(它允许在哈希之后使用url参数并且直接来自github问题跟踪器上的Bootstrap作者):

// Javascript to enable link to tab
var hash = document.location.hash;
var prefix = "tab_";

if (hash) {
    hash = hash.replace(prefix,'');
    var hashPieces = hash.split('?');
    activeTab = $('.nav-tabs a[href=' + hashPieces[0] + ']');
    activeTab && activeTab.tab('show');
} 

// Change hash for page-reload
$('.nav-tabs a').on('shown', function (e) {
    window.location.hash = e.target.hash.replace("#", "#" + prefix);
});

答案 8 :(得分:6)

此代码根据#hash选择正确的选项卡,并在单击选项卡时添加正确的#hash。 (这使用jquery)

在Coffeescript中:

$(document).ready ->
    if location.hash != ''
        $('a[href="'+location.hash+'"]').tab('show')

    $('a[data-toggle="tab"]').on 'shown', (e) ->
        location.hash = $(e.target).attr('href').substr(1)

或在JS中:

$(document).ready(function() {
    if (location.hash !== '') $('a[href="' + location.hash + '"]').tab('show');
    return $('a[data-toggle="tab"]').on('shown', function(e) {
      return location.hash = $(e.target).attr('href').substr(1);
    });
});

答案 9 :(得分:6)

以Demircan Celebi的解决方案为基础;我希望在修改URL和打开选项卡时打开选项卡,而不必从服务器重新加载页面。

<script type="text/javascript">
    $(function() {
        openTabHash(); // for the initial page load
        window.addEventListener("hashchange", openTabHash, false); // for later changes to url
    });


    function openTabHash()
    {
        console.log('openTabHash');
        // Javascript to enable link to tab
        var url = document.location.toString();
        if (url.match('#')) {
            $('.nav-tabs a[href="#'+url.split('#')[1]+'"]').tab('show') ;
        } 

        // With HTML5 history API, we can easily prevent scrolling!
        $('.nav-tabs a').on('shown.bs.tab', function (e) {
            if(history.pushState) {
                history.pushState(null, null, e.target.hash); 
            } else {
                window.location.hash = e.target.hash; //Polyfill for old browsers
            }
        })
    }
</script>

答案 10 :(得分:5)

我用于嵌套标签的@flynfish + @Ztyx解决方案:

    handleTabLinks();

    function handleTabLinks() {
        if(window.location.hash == '') {
            window.location.hash = window.location.hash + '#_';
        }
        var hash = window.location.hash.split('#')[1];
        var prefix = '_';
        var hpieces = hash.split('/');
        for (var i=0;i<hpieces.length;i++) {
            var domelid = hpieces[i].replace(prefix,'');
            var domitem = $('a[href=#' + domelid + '][data-toggle=tab]');
            if (domitem.length > 0) {
                domitem.tab('show');
            }
        }
        $('a[data-toggle=tab]').on('shown', function (e) {
            if ($(this).hasClass('nested')) {
                var nested = window.location.hash.split('/');
                window.location.hash = nested[0] + '/' + e.target.hash.split('#')[1];
            } else {
                window.location.hash = e.target.hash.replace('#', '#' + prefix);
            }
        });
    }

儿童应该有class =“nested”

答案 11 :(得分:5)

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

来自http://github.com/twitter/bootstrap/issues/2415#issuecomment-4450768的代码非常适合我。

答案 12 :(得分:5)

感谢您分享您的观点。

阅读所有解决方案。我想出了一个使用url hash或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');
    }
});

答案 13 :(得分:4)

我建议您使用Bootstrap作者提供的代码issue tracker on GitHub

var hash = location.hash
  , hashPieces = hash.split('?')
  , activeTab = $('[href=' + hashPieces[0] + ']');
activeTab && activeTab.tab('show');

您可以在问题的链接上找到有关他们为什么不选择支持该问题的更多信息。

答案 14 :(得分:3)

这就是我所做的,非常简单,如果您的标签链接有一个与之关联的ID,您可以获取href属性并将其传递给显示标签内容的函数:

<script type="text/javascript">
        jQuery(document).ready(function() {
            var hash = document.location.hash;
            var prefix = "tab_";
            if (hash) {
                var tab = jQuery(hash.replace(prefix,"")).attr('href');
                jQuery('.nav-tabs a[href='+tab+']').tab('show');
            }
        });
        </script>

然后在你的网址中你可以添加哈希值:#tab_tab1,'tab_'部分从哈希本身中删除,因此nav-tabs(tabid1)中实际选项卡链接的ID放在此之后,所以你的网址看起来像:www.mydomain.com/index.php#tab_tabid1。

这对我来说很完美,希望它可以帮助别人: - )

答案 15 :(得分:3)

尝试了上面讨论的几种方法并最终得到以下工作解决方案,只需复制并粘贴到您的编辑器中即可尝试。要测试只是将哈希更改为收件箱,发件箱,请在网址中撰写并按Enter键。

<html>
    <head>
        <link type='text/css' rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css' />
        <script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div class="container body-content">
            <ul class="nav nav-tabs">
                <li class="active"><a data-toggle="tab" href="#inbox">Inbox</a></li>
                <li><a data-toggle="tab" href="#outbox">Outbox</a></li>
                <li><a data-toggle="tab" href="#compose">Compose</a></li>
            </ul>
            <div class="tab-content">
                <div id="inbox" class="tab-pane fade in active">
                    Inbox Content
                </div>
                <div id="outbox" class="tab-pane fade">
                    Outbox Content
                </div>
                <div id="compose" class="tab-pane fade">
                    Compose Content
                </div>
            </div>
        </div>
        <script>
            $(function () {
                var hash = window.location.hash;
                hash && $('ul.nav a[href="' + hash + '"]').tab('show');
            });
        </script>
    </body>
</html>

希望这会节省你的时间。

答案 16 :(得分:2)

这是我处理嵌套标签的解决方案。 我刚添加了一个函数来检查活动选项卡是否有一个要激活的父选项卡。 这是功能:

function activateParentTab(tab) {
    $('.tab-pane').each(function() {
        var cur_tab = $(this);
        if ( $(this).find('#' + tab).length > 0 ) {
            $('.nav-tabs a[href=#'+ cur_tab.attr('id') +']').tab('show');
            return false;
        }
    });
}

可以这样调用(基于@ flynfish的解决方案):

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

// Change hash for page-reload
$('.nav-tabs a').on('shown', function (e) {
    window.location.hash = e.target.hash.replace("#", "#" + prefix);
});

此解决方案目前对我来说非常好。 希望这对其他人有用;)

答案 17 :(得分:2)

我必须修改一些内容才能为我工作。 我正在使用Bootstrap 3和jQuery 2

// Javascript to enable link to tab
var hash = document.location.hash;
var prefix = "!";
if (hash) {
    hash = hash.replace(prefix,'');
    var hashPieces = hash.split('?');
    activeTab = $('[role="tablist"] a[href=' + hashPieces[0] + ']');
    activeTab && activeTab.tab('show');
}

// Change hash for page-reload
$('[role="tablist"] a').on('shown.bs.tab', function (e) {
    window.location.hash = e.target.hash.replace("#", "#" + prefix);
});

答案 18 :(得分:1)

我刚遇到此问题,但需要处理多个标签级别。代码相当丑陋(见评论),但它的工作是:https://gist.github.com/JensRantil/4721860希望其他人会发现它很有用(并且可以随意提出更好的解决方案!)。

答案 19 :(得分:1)

结合其他答案中的peices,这是一个可以打开多层嵌套选项卡的解决方案:

// opens all tabs down to the specified tab
var hash = location.hash.split('?')[0];
if(hash) {
  var $link = $('[href=' + hash + ']');
  var parents = $link.parents('.tab-pane').get();
  $(parents.reverse()).each(function() {
    $('[href=#' + this.id + ']').tab('show') ;
  });
  $link.tab('show');
}

答案 20 :(得分:1)

只需在您的页面上插入以下代码即可:

$(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();
    window.location.hash = this.hash;
    $('html,body').scrollTop(scrollmem);
  });
});

答案 21 :(得分:0)

对于带有ajax #!#的链接(例如/test.com#!#test3),我会这样做,但你可以随意修改它

$(document).ready(function() {

       let hash = document.location.hash;
       let prefix = "!#";

       //change hash url on page reload
       if (hash) {
         $('.nav-tabs a[href=\"'+hash.replace(prefix,"")+'\"]').tab('show');
       } 

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

简单页面on Github here

的示例

答案 22 :(得分:0)

如果对任何人都重要,那么下面的代码很小并且可以完美地从URL获取单个哈希值并显示:

<script>
    window.onload = function () {
        let url = document.location.toString();
        let splitHash = url.split("#");
        document.getElementById(splitHash[1]).click();
    };
</script>

它所做的是检索ID并触发click事件。很简单。

答案 23 :(得分:0)

我知道这个线程很旧,但是我将在这里留下自己的实现:

$(function () {
  // some initialization code

  addTabBehavior()
})

// Initialize events and change tab on first page load.
function addTabBehavior() {
  $('.nav-tabs a').on('show.bs.tab', e => {
    window.location.hash = e.target.hash.replace('nav-', '')
  })

  $(window).on('popstate', e => {
    changeTab()
  })

  changeTab()
}

// Change the current tab and URL hash; if don't have any hash
// in URL, so activate the first tab and update the URL hash.
function changeTab() {
  const hash = getUrlHash()

  if (hash) {
    $(`.nav-tabs a[href="#nav-${hash}"]`).tab('show')
  } else {
    $('.nav-tabs a').first().tab('show')
  }
}

// Get the hash from URL. Ex: www.example.com/#tab1
function getUrlHash() {
  return window.location.hash.slice(1)
}

请注意,我在导航链接中使用的是nav-类前缀。