Лучший способ сделать так, чтобы вкладки начальной загрузки Twitter были постоянными - PullRequest
43 голосов
/ 13 марта 2012

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

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

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

Ответы [ 8 ]

83 голосов
/ 12 апреля 2012

Этот код выбирает правую вкладку в зависимости от #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);
    });
});
35 голосов
/ 30 января 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);
       }
    });
});
14 голосов
/ 20 августа 2012

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

Сначала добавьте строку к событию 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');
}
6 голосов
/ 11 апреля 2017

Я хотел бы улучшить два лучших ответа здесь.(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');
};
1 голос
/ 26 февраля 2015

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

1 голос
/ 10 июня 2014

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

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

});
1 голос
/ 13 марта 2012

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

if (window.location.hash) {
    $(window.location.hash).tab('show')
}
0 голосов
/ 15 августа 2018

Протестировано для Bootstrap 4, минималистский (2 строки) код без добавления истории, который работает на любой странице с навигационными вкладками.

<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>
...