Лучший способ сделать вкладки бутстрапа twitter постоянными
Каков наилучший способ сделать эти вкладки упорными?
http://twitter.github.com/bootstrap/javascript.html#tabs
Чтобы добавить некоторый контекст, это для приложения rails. Я передаю массив [tab1, tab2] в мое представление, отображая обе вкладки и используя плагин tabstrap tab, чтобы переключить их видимость.
Ответы
Ответ 1
Этот код выбирает правильную вкладку в зависимости от #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);
});
});
Ответ 2
Я хотел улучшить лучший ответ здесь.
Кредит переходит к 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);
}
});
});
Ответ 3
Вот еще один способ решить проблему.
Сначала добавьте строку в событие 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');
}
Ответ 4
Я хотел улучшить лучшие два ответа здесь..:)
Кредит идет на 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');
};
Ответ 5
Вы можете получить фрагмент URL-адреса (часть URL-адреса после #
) при загрузке с помощью window.location.hash
и конкретно установить эту вкладку как видимую:
if (window.location.hash) {
$(window.location.hash).tab('show')
}
Ответ 6
Другая измененная версия, если вы не хотите добавлять закладки в историю, но также не хотите, чтобы страница прыгала вверх и вниз:
$(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);
}
});
});
Ответ 7
Выполните следующий код после загрузки 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