Quel est le meilleur moyen de faire persister ces onglets?
http://Twitter.github.com/bootstrap/javascript.html#tabs
Pour ajouter du contexte, il s’agit d’une application Rails. Je passe un tableau [tab1, tab2] à ma vue, rendant les deux onglets et utilisant le plug-in d'amorçage pour changer leur visibilité.
Ce code sélectionne le bon onglet en fonction du #hash et ajoute le droit #hash quand un onglet est cliqué (cela utilise jquery)
Dans 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)
ou en 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);
});
});
Je voulais améliorer la meilleure réponse ici ..
Le mérite revient à Sucrenoir, mais si vous voulez éviter de sauter sur la page lorsque vous changez d'onglet, utilisez ce code amélioré:
$(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);
}
});
});
Voici un autre moyen de résoudre le problème.
Commencez par ajouter une ligne à l'événement click pour afficher le hachage dans la barre d'adresses.
$('#myTab').on('click', 'a', function (e) {
e.preventDefault();
// add this line
window.location.hash = $(this).attr('href');
$(this).tab('show');
})
Assurez-vous ensuite que le bon onglet est activé onload
en ajoutant cette partie à votre appel de document prêt.
if(window.location.hash){
$('#myTab').find('a[href="'+window.location.hash+'"]').tab('show');
}
Tous ensemble, vous pouvez écrire ceci:
// 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');
}
Je voulais améliorer les deux meilleures réponses ici .. :)
Le crédit va à Sucrenoir et D-Wade.
Comme le code est utilisé dans l'API d'historique, vous ne pouvez pas utiliser onchangehash ( https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onhashchange ). Ce code ajoute les fonctionnalités du bouton Précédent ( 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');
};
Une autre version modifiée si vous ne voulez pas que des clics d'onglets soient ajoutés à l'historique, mais ne souhaitez pas non plus que la page saute de haut en bas:
$(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);
}
});
});
Exécutez le code suivant après le chargement du 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');
}
Cependant, cela conduit à une expérience d’interface utilisateur médiocre, puisque l’onglet actuellement actif sera affiché en premier, puis basculera vers un onglet de location.hash
Vous pouvez obtenir le fragment d'URL (c'est-à-dire la partie de l'URL après #
) au chargement à l'aide de window.location.hash
, et définir spécifiquement cet onglet comme visible:
if (window.location.hash) {
$(window.location.hash).tab('show')
}
Testé pour Bootstrap 4, code minimaliste (2 lignes) sans historique Push, qui fonctionne sur n’importe quelle page avec des onglets de navigation.
<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>