2012-03-13 11 views
39

Qual è il modo migliore per rendere persistenti queste schede?Il modo migliore per rendere persistenti le schede di bootstrap di Twitter

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

Per aggiungere un po 'di contesto, questo è per un'applicazione Rails. Sto passando un array [tab1, tab2] alla mia vista, rendendo entrambe le schede e utilizzando il plug-in della scheda bootstrap per attivare la loro visibilità.

+0

utilizza un linguaggio lato server come php? – DG3

+0

utilizzando le guide e la gemma twitter-bootstrap-rails – DanS

+0

non è possibile utilizzare una variabile URL durante l'aggiornamento della pagina e renderla predefinita utilizzando le guide? – DG3

risposta

80

Questo codice seleziona la scheda a destra a seconda del # hash e aggiunge il diritto #hash quando si fa clic su una scheda. (Puo utilizza jquery)

In 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) 

o in 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

Grazie mille per questa risposta. Ho apportato alcune modifiche al fine di evitare due problemi: 1) Le schede di commutazione si aggiungevano alla cronologia di navigazione e 2) La posizione di scorrimento era persa sul back-nav a causa della navigazione dei frammenti. https://gist.github.com/josheinstein/5586469 – Josh

+21

Questo non funzionerà nel bootstrap 3. Usa 'shown.bs.tab' invece di' shown' per il nome dell'evento. [Controlla qui] (http://getbootstrap.com/javascript/#tabs) – zentralmaschine

+18

ottima risposta, ma se vuoi evitare di "saltare" la pagina quando inizi a fare clic sulle tue schede, usa questo codice invece di "return" '$ ('a [data-toggle =" scheda "]'). 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

è possibile ottenere il frammento di URL (che è la parte dell'URL dopo #) sul carico tramite window.location.hash, e impostare in particolare quella scheda come visibile:

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

L'hash non verrà inviato al server, quindi non sono sicuro di come lo userei da solo. – DanS

+0

Non verrà inviato al server in quanto non ha bisogno di essere - l'esempio sopra è javascript. Ad esempio, se si dispone di un elemento 'a' che invia il browser a' yoursite.com/about # company' verrà visualizzata la scheda '# company'. Al momento dell'aggiornamento, l'URL verrà controllato per un frammento e, se ce n'è uno, visualizzerà la scheda con l'ID di corrispondenza corrispondente per impostazione predefinita. –

+0

Ho modificato la mia domanda per rimuovere il 'persist un refresh' in quanto era fuorviante. Il mio vero problema è che ho i collegamenti di paginazione e quando cambio pagina in tab2 ritorna in tab1 – DanS

14

Ecco un altro modo per risolvere il problema.

Prima aggiungere una linea per l'evento click per mostrare l'hash nel AddressBar

$('#myTab').on('click', 'a', function (e) { 
    e.preventDefault(); 
    // add this line 
    window.location.hash = $(this).attr('href'); 
    $(this).tab('show'); 
}) 

Quindi assicurarsi che la scheda a destra si attiva onload con l'aggiunta di questa parte per il documento chiamata pronto.

if(window.location.hash){ 
    $('#myTab').find('a[href="'+window.location.hash+'"]').tab('show'); 
} 

Tutti insieme si può scrivere questo:

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

C'è un modo per fare in modo di utilizzare i pulsanti Indietro e Avanti del browser ?? –

+1

Hai provato? Dovrebbe cambiare la cronologia in base agli hash modificati nell'URL. https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Manipulating_the_browser_history – HaNdTriX

+0

Sì ... Lo script cambia l'URL del browser relativo alla scheda selezionata ma in realtà non modifica la scheda stessa. rimane ancora come quello attivo quando viene premuta la freccia indietro del browser. –

32

volevo migliorare la risposta migliore qui ..

merito va a Sucrenoir, ma se si vuole evitare di saltare sulla pagina quando si cambia le schede, utilizzare questo codice migliorato:

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

Risposta migliore per bootstrap 3 – AshHimself

+0

Copia, incolla e si rilassa. Grazie –

+0

mentre la risposta @Sucrenoir è buona e l'ho usata per risolvere il mio problema, questa risposta lo sostituisce perché in qualche modo sulla risposta di Sucrenoir la pagina non aggiorna il '#' al primo cambio di tabulazione. Solo il primo Tuttavia questo codice, @dootzky * fa * aggiorna il riferimento sul primo e ogni clic sulla scheda. Cheers – Martin

1

Un'altra versione modificata, se non si vuole scheda scatta da aggiungere alla storia, ma anche non vogliono pagina saltando su e giù:

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

eseguire il codice seguente dopo il carico 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'); 
} 

Tuttavia, questo porta a poveri l'esperienza utente, in quanto scheda attualmente attiva verrà mostrato prima, e poi sarà passato a uno scheda da location.hash

3

volevo migliorare le due migliori risposte qui .. :)

Credito va a Sucrenoir e d-wade.

Perché nel codice viene utilizzata l'API della cronologia non è possibile utilizzare onchangehash (https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onhashchange). Questo codice aggiunge la funzionalità del pulsante Indietro (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

Ho riscontrato problemi con le risposte precedenti per rendere l'hash append nell'URL quando viene visualizzata una scheda ... Questa risposta ha funzionato perfettamente out-of-the-box per me –

Problemi correlati