使这些标签持续存在的最佳方法是什么?
http://twitter.github.com/bootstrap/javascript.html#tabs
要添加一些上下文,这适用于rails应用程序。我将一个数组[tab1,tab2]传递给我的视图,渲染两个选项卡并使用引导选项卡插件来切换它们的可见性。
答案 0 :(得分:83)
此代码根据#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);
});
});
答案 1 :(得分:35)
我想在这里改善最佳答案..
归功于Sucrenoir,但如果您想在更改标签时避免跳到页面上,请使用此改进的代码:
$(document).ready(function() {
// show active tab on reload
if (location.hash !== '') $('a[href="' + location.hash + '"]').tab('show');
// remember the hash in the URL without jumping
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
if(history.pushState) {
history.pushState(null, null, '#'+$(e.target).attr('href').substr(1));
} else {
location.hash = '#'+$(e.target).attr('href').substr(1);
}
});
});
答案 2 :(得分:14)
这是解决问题的另一种方法。
首先在click事件中添加一行以在地址栏中显示哈希
$('#myTab').on('click', 'a', function (e) {
e.preventDefault();
// add this line
window.location.hash = $(this).attr('href');
$(this).tab('show');
})
然后通过将此部分添加到您的文档就绪电话中,确保激活了正确的标签onload
。
if(window.location.hash){
$('#myTab').find('a[href="'+window.location.hash+'"]').tab('show');
}
你们可以一起写下这个:
// cache the id
var navbox = $('#myTab');
// activate tab on click
navbox.on('click', 'a', function (e) {
var $this = $(this);
// prevent the Default behavior
e.preventDefault();
// set the hash to the address bar
window.location.hash = $this.attr('href');
// activate the clicked tab
$this.tab('show');
})
// if we have a hash in the address bar
if(window.location.hash){
// show right tab on load (read hash from address bar)
navbox.find('a[href="'+window.location.hash+'"]').tab('show');
}
答案 3 :(得分:6)
我想在这里改进最好的两个答案.. :)
归功于Sucrenoir和d-wade。
因为在代码中使用了历史记录API,所以不能使用onchangehash(https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onhashchange)。此代码添加了后退按钮(https://developer.mozilla.org/cs/docs/Web/API/WindowEventHandlers/onpopstate)的功能。
// show active tab on reload
if (location.hash !== '') $('a[href="' + location.hash + '"]').tab('show');
// remember the hash in the URL without jumping
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
if(history.pushState) {
history.pushState(null, null, '#'+$(e.target).attr('href').substr(1));
} else {
location.hash = '#'+$(e.target).attr('href').substr(1);
}
});
// remember to back button
window.onpopstate = function(e) {
$('a[href="' + location.hash + '"]').tab('show');
};
答案 4 :(得分:1)
您可以使用#
在加载时获取网址片段(在window.location.hash
之后的网址的一部分),并专门将该标签设置为可见:
if (window.location.hash) {
$(window.location.hash).tab('show')
}
答案 5 :(得分:1)
另一个修改后的版本,如果您不希望将标签点击添加到历史记录中,但也不希望页面上下跳动:
$(document).ready(function () {
if (location.hash !== '') {
$('a[href="' + location.hash + '"]').tab('show');
}
$("a[data-toggle='tab']").on("shown.bs.tab", function (e) {
var hash = $(e.target).attr("href");
if (hash.substr(0,1) == "#") {
var position = $(window).scrollTop();
location.replace("#" + hash.substr(1));
$(window).scrollTop(position);
}
});
});
答案 6 :(得分:1)
在DOM加载后执行以下代码:
$('a[data-toggle=tab]').on('click', function () {
history.pushState(null, null, $(this).attr('href'));
});
if (window.location.hash) {
$('a[data-toggle=tab][href="' + window.location.hash + '"]').tab('show');
}
但是,这会导致糟糕的用户体验,因为当前显示的是活动标签,然后它会从location.hash切换到标签
答案 7 :(得分:0)
经过Bootstrap 4(不含历史记录推送)的极简代码(两行)的测试,该代码可在带有导航标签的任何页面上使用。
<script type="text/javascript">
$(document).ready(function(){
// store the currently selected tab in the hash value
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { location.replace($(e.target).attr("href")); });
// switch to the currently selected tab when loading the page
$('.nav-tabs a[href="' + window.location.hash + '"]').tab('show');
});
</script>