Лучший способ сделать вкладки Twitter Bootstrap постоянными

Каков наилучший способ сделать эти вкладки постоянными?

http://twitter.github.com/bootstrap/javascript.html#tabs

Чтобы добавить немного контекста, это для приложения Ruby on Rails. Я передаю массив [tab1, tab2] в свое представление, отображаю обе вкладки и использую плагин вкладки Bootstrap для переключения их видимости.


person DanS    schedule 13.03.2012    source источник
comment
используете какой-либо серверный язык, например php?   -  person DG3    schedule 13.03.2012
comment
используя рельсы и гем twitter-bootstrap-rails   -  person DanS    schedule 13.03.2012
comment
вы не можете использовать переменную URL во время обновления страницы и сделать ее по умолчанию с помощью рельсов?   -  person DG3    schedule 13.03.2012


Ответы (8)


Этот код выбирает правильную вкладку в зависимости от #хэша и добавляет правильный #хэш при нажатии на вкладку. (это использует jQuery)

В кофескрипте:

$(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)

Или в JavaScript:

$(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);
    });
});
person Sucrenoir    schedule 12.04.2012
comment
Большое спасибо за этот ответ. Я внес некоторые изменения, чтобы избежать двух проблем: 1) переключение вкладок добавляло в историю навигации и 2) положение прокрутки терялось в задней части навигации из-за фрагментарной навигации. gist.github.com/josheinstein/5586469 - person Josh; 15.05.2013
comment
Это не будет работать в начальной загрузке 3. Используйте shown.bs.tab вместо shown для имени события. Проверьте здесь - person zentralmaschine; 26.10.2013
comment
отличный ответ, но если вы хотите избежать прыжков со страницы, когда вы начинаете нажимать на вкладки, используйте этот код вместо return $('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); }); - person d-wade; 30.01.2014
comment
Я внес изменение в Bootstrap 3, добавил его в свое приложение Rails, и оно сработало. Между Rails, gems и StackOverflow я чувствую, что почти не пишу никакого реального кода. - person Ryan Bosinger; 09.04.2014

Я хотел улучшить лучший ответ здесь...

Кредит идет 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);
       }
    });
});
person d-wade    schedule 29.01.2014
comment
Лучший ответ для начальной загрузки 3 - person AshHimself; 23.12.2014
comment
Скопируйте, вставьте и расслабьтесь. Спасибо - person Bojan Kogoj; 16.12.2015
comment
в то время как ответ @Sucrenoir является хорошим, и я использовал его для решения своей проблемы, этот ответ заменяет его, потому что каким-то образом в ответе Sucrenoir страница не обновляет # при изменении первой вкладки. Только первый. Однако этот код от @dootzky действительно обновляет ссылку при первом и каждом нажатии на вкладку. Ваше здоровье - person Martin; 02.02.2016
comment
Я получаю сообщение об ошибке TypeError: $(...).attr(...) is undefined для этой строки history.pushState(null, null, '#' + $(e.target).attr('href').substr(1)); - person Musakkhir Sayyed; 28.09.2016
comment
При переходе по вкладкам, а затем при нажатии кнопки возврата браузера не загружается ранее выбранная вкладка. - person karns; 10.07.2020

Вот еще один способ решить проблему.

Сначала добавьте строку к событию клика, чтобы отобразить хеш в адресной строке:

$('#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');
}
person HaNdTriX    schedule 20.08.2012
comment
Есть ли способ заставить это использовать кнопки браузера «назад» и «вперед» ?? - person Jack Eccleshall; 03.09.2013
comment
Вы проверили это? Он должен изменить историю на основе измененных хэшей в URL-адресе. developer.mozilla.org/en-US/docs/Web/ Путеводитель/ДОМ/ - person HaNdTriX; 03.09.2013
comment
Да... Сценарий изменяет URL-адрес браузера, относящийся к выбранной вкладке, но фактически не меняет саму вкладку. он по-прежнему остается тем, на котором он находится, когда нажимается стрелка назад браузера. - person Jack Eccleshall; 03.09.2013
comment
Хорошо, вам нужно прослушать hashchangeevent. Quick&Dirty: Демо | Код - person HaNdTriX; 03.09.2013

Я хотел улучшить два лучших ответа здесь .. :)

Кредит принадлежит 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');
};
person Pavel Berka    schedule 11.04.2017
comment
У меня были проблемы с предыдущими ответами, чтобы добавить хеш к URL-адресу при отображении вкладки... Этот ответ отлично сработал для меня. - person Aaron Lavers; 23.06.2017

Протестировано для 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>
person Awsom3D    schedule 15.08.2018
comment
Это просто работает! Просто скопипастил и все! (Самозагрузка4) - person lewis4u; 22.08.2019

Вы можете получить фрагмент URL-адреса (это часть URL-адреса после #) при загрузке с помощью window.location.hash и, в частности, сделать эту вкладку видимой:

if (window.location.hash) {
    $(window.location.hash).tab('show')
}
person Rory McCrossan    schedule 13.03.2012
comment
Хэш не будет отправлен на сервер, поэтому не знаю, как я буду использовать это самостоятельно. - person DanS; 14.03.2012
comment
Он не будет отправлен на сервер, так как в этом нет необходимости - приведенный выше пример - это javascript. Например, если у вас есть элемент a, который отправляет браузер на yoursite.com/about#company, будет отображаться вкладка #company. При обновлении URL-адрес будет проверяться на наличие фрагмента, и если он есть, по умолчанию будет отображаться вкладка с соответствующим id. - person Rory McCrossan; 14.03.2012
comment
Я отредактировал свой вопрос, чтобы удалить «постоянное обновление», поскольку это вводило в заблуждение. Моя настоящая проблема в том, что у меня есть ссылки на страницы, и когда я меняю страницу на вкладке 2, она возвращается к вкладке 1. - person DanS; 14.03.2012

Еще одна модифицированная версия, если вы не хотите, чтобы в историю добавлялись нажатия вкладок, но также не хотите, чтобы страница прыгала вверх и вниз:

$(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);
    }
  });

});
person Greg Houston    schedule 09.06.2014

Выполните следующий код после загрузки 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.

person Artur Beljajev    schedule 26.02.2015