2012-03-13 3 views
39

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

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

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

+0

использует любой язык на стороне сервера, например php? – DG3

+0

с использованием рельсов и твитер-бутстрапов-рельсов gem – DanS

+0

Вы не можете использовать переменную URL во время обновления страницы и использовать ее по умолчанию с помощью рельсов? – DG3

ответ

80

Этот код выбирает вкладку вправо в зависимости от # хэш и добавляет право #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); 
    }); 
}); 
+8

Большое спасибо за этот ответ. Я сделал некоторые изменения, чтобы избежать двух проблем: 1) Переключение вкладок добавляло в историю навигации и 2) Положение прокрутки было потеряно на заднем навигаторе из-за навигации фрагмента. https://gist.github.com/josheinstein/5586469 – Josh

+21

Это не будет работать в bootstrap 3. Используйте 'показанный.bs.tab' вместо' показанного' для имени события. [Check here] (http://getbootstrap.com/javascript/#tabs) – zentralmaschine

+18

отличный ответ, но если вы хотите избежать «перескакивания» страницы при нажатии на ваши вкладки, используйте этот код вместо «return», '$ ('a [data-toggle =" tab "]'). On ('показано.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); }); ' –

1

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

if (window.location.hash) { 
    $(window.location.hash).tab('show') 
} 
+0

Хеш не будет отправлен на сервер, поэтому не уверен, как я буду использовать это на своем собственном. – DanS

+0

Он не будет отправлен на сервер, поскольку ему не нужно быть - пример выше - это javascript. Например, если у вас есть элемент 'a', который отправляет браузер на' yoursite.com/about # company', отобразится вкладка '# company'. При обновлении URL-адрес будет проверяться на наличие фрагмента, и если он есть, по умолчанию будет отображаться вкладка с соответствующим «id». –

+0

Я отредактировал мой вопрос, чтобы удалить «persist a refresh», поскольку он вводит в заблуждение. Моя реальная проблема в том, что у меня есть ссылки на страницы, и когда я меняю страницу в tab2, она возвращается обратно в tab1 – DanS

14

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

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

$('#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'); 
} 
+0

Есть ли способ сделать это использовать кнопки назад и вперед браузера? –

+1

Вы проверили это? Это должно изменить историю, основанную на измененных хэшах в URL-адресе. https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Manipulating_the_browser_history – HaNdTriX

+0

Да ... Сценарий изменяет URL-адрес браузера, соответствующий выбранной вкладке, но фактически не изменяет вкладку. он по-прежнему остается тем, на котором он включен, когда нажимается стрелка назад. –

32

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

Заслуга 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); 
     } 
    }); 
}); 
+1

Лучший ответ на загрузку 3 – AshHimself

+0

Скопируйте, вставьте и расслабьтесь. Спасибо –

+0

, в то время как ответ @Sucrenoir - хороший, и я использовал это, чтобы решить мою собственную проблему, этот ответ заменяет его, потому что каким-то образом на ответе Сукренуара страница не обновляет '#' при первом изменении вкладок. Только первый. Однако этот код, @dootzky *, * обновляет ссылку на первый и каждый вкладки. Cheers – Martin

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

}); 
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'); 
} 

Однако, это приводит к плохому опыт UI, так как в настоящее время активной вкладки будет показан первым, а затем она будет переключена на вкладку с location.hash

3

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

Кредит идет на 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'); 
}; 
+0

У меня возникли проблемы с предыдущими ответами, чтобы добавить хэш в URL-адрес при отображении вкладки ... Этот ответ работал отлично из коробки для меня –

Смежные вопросы