我正在开发一个网页,使用Twitter的Bootstrap框架和他们的Bootstrap Tabs JS。它非常好用,除了一些小问题之外,其中之一是我不知道如何从外部链接直接跳转到特定选项卡。例如:
<a href="facility.php#home">Home</a>
<a href="facility.php#notes">Notes</a>
当从外部页面点击链接时,应分别跳转到主页和笔记选项卡
我正在开发一个网页,使用Twitter的Bootstrap框架和他们的Bootstrap Tabs JS。它非常好用,除了一些小问题之外,其中之一是我不知道如何从外部链接直接跳转到特定选项卡。例如:
<a href="facility.php#home">Home</a>
<a href="facility.php#notes">Notes</a>
当从外部页面点击链接时,应分别跳转到主页和笔记选项卡
以下是我的解决方案,可能有点晚了,但它可能对其他人有所帮助:
// 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;
})
window.scrollTo(0, 0);
,以确保窗口始终滚动到顶部。 - Trung Lê语法错误,无法识别的表达式:.nav-tabs a[href=#tab-2]
。使用https://dev59.com/W2ct5IYBdhLWcg3wZMfn 已解决。 - Pietro Z.更新
对于 Bootstrap 3,将 .on('shown', ...)
改为 .on('shown.bs.tab', ....)
这是基于 @dubbe 的回答和这个被接受的 SO 回答。它解决了 window.scrollTo(0,0)
不正确工作的问题。问题在于当你替换标签时,浏览器会滚动到该标签,因为它是页面上的一个元素。为了解决这个问题,加一个前缀,这样哈希不引用实际的页面元素。
// 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"的tab-pane,您需要这样放置链接:
<a href="yoursite.com/#tab_mytab">Go to Specific Tab </a>
$('.nav-tabs a[href="'+hash.replace(prefix,"")+'"]').tab('show');
- Ponyboynav-tabs
链接。那些链接仍然具有相同的哈希值。 - timetofly您可以触发相应选项卡链接的click
事件:
$(document).ready(function(){
if(window.location.hash != "") {
$('a[href="' + window.location.hash + '"]').click()
}
});
$(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()
};
});
- mraliks这是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的值,并在适当的
伪代码(根据您的编程语言实现)。请注意,在此示例中,如果未提供参数,则将“主页”选项卡设置为默认活动选项卡。
$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>
我不是if...else的忠实拥护者,所以我采用了更简单的方法。
$(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;
})
});
这并没有解决滚动到请求的哈希值的问题; 但是应该吗?
// 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);
});
'shown'
应该是'shown.bs.tab'
:http://getbootstrap.com/javascript/#tabs-events。我很困惑,但当我尝试编辑您的帖子时,它被拒绝了... - YPCrumble<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>
只需将此代码插入您的页面:
$(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);
});
});