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

IT技术 javascript html tabs twitter-bootstrap
2021-01-27 20:24:14

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

<a href="facility.php#home">Home</a>
<a href="facility.php#notes">Notes</a>

单击外部页面的链接时,应分别转到“主页”选项卡和“备注”选项卡

6个回答

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

// Javascript to enable link to tab
var hash = location.hash.replace(/^#/, '');  // ^ means starting, meaning only match the first hash
if (hash) {
    $('.nav-tabs a[href="#' + hash + '"]').tab('show');
} 

// Change hash for page-reload
$('.nav-tabs a').on('shown.bs.tab', function (e) {
    window.location.hash = e.target.hash;
})
这是 Bootstrap 3 的演示:bootply.com/render/VQqzOawoYc#tab2源代码
2021-03-20 20:24:14
$('.nav-tabs a[href*=#'+url.split('#')[1]+']').tab('show'); // 使用 * 更安全,否则它只匹配第一个 #...
2021-03-25 20:24:14
对我有用的在线: window.location.hash && $('li a[href="' + window.location.hash+ '"]').tab('show').trigger("click");
2021-03-25 20:24:14
我会再添加 1 行window.scrollTo(0, 0);以确保窗口始终滚动到顶部
2021-04-01 20:24:14
从1.09升级了jQuery 1.11后,我得到这个错误:Syntax error, unrecognized expression: .nav-tabs a[href=#tab-2]使用stackoverflow.com/questions/12131273/...解决
2021-04-08 20:24:14

更新

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


这是基于@dubbe答案和这个SO 接受的答案它处理window.scrollTo(0,0)无法正常工作的问题问题是,当您替换显示的选项卡上的 url 哈希时,浏览器将滚动到该哈希,因为它是页面上的一个元素。为了解决这个问题,添加一个前缀,这样哈希就不会引用实际的页面元素

// 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>
上面的示例缺少 href 上的双引号。第 5 行应该是:$('.nav-tabs a[href="'+hash.replace(prefix,"")+'"]').tab('show');
2021-03-21 20:24:14
这是 Bootstrap 3 的 Bootlpy 演示:bootply.com/render/VQqzOawoYc#tab2源代码
2021-03-27 20:24:14
对我有用,只是我必须删除“yoursite.com/anotherpage/#tab_mytab”中的最后一个正斜杠(# 之前),否则它会破坏页面加载。
2021-03-28 20:24:14
@nize 如果你创建了一个 jsfiddle,你正在尝试做我会尝试看看。
2021-04-01 20:24:14
是否有一种简单的方法来引用位于特定选项卡下的书签?我的页面上有五个标签,在这些标签下有许多书签。我想要的是使这些书签可从选项卡外部链接。
2021-04-02 20:24:14

您可以click在相应的选项卡链接上触发事件:

$(document).ready(function(){

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

});
谢谢你的提示!这对一个小问题很有效。刷新页面,不会将其带到正确的选项卡。按 Ctrl+F5 会。我将代码修改为以下内容:` $(document).ready(function(){ function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([ ^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars; } var action = getUrlVars()["action" ]; if (action != "") { $('a[href="#' + action + '"]').click() }; }); `
2021-03-20 20:24:14

这是 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
    }
})

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

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

然后您只需检测 activeTab 的值以在适当的位置写入 'class="active"' <li>

伪代码(用您的语言相应地实现)。请注意,如果此示例中未提供参数,我已将“主页”选项卡设置为默认活动。

$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>
我更喜欢这个解决方案。事实上,我通过相应地设置活动类为选项卡创建了新路由并重新生成了视图。这避免了页面调整大小、url 哈希和页面滚动的头痛。
2021-03-15 20:24:14
我更喜欢你的解决方案而不是 JS 解决方案,因为一个简单的原因是 JS location.hash 会跳转到导致光标位置上下移动的 ID。
2021-03-17 20:24:14