Bootstrap 3: Mantieni la scheda selezionata durante l'aggiornamento della pagina


120

Sto cercando di mantenere attiva la scheda selezionata durante l'aggiornamento con Bootstrap 3 . Ho provato e verificato con alcune domande già poste qui ma nessuna di lavoro per me. Non so dove sbaglio. Ecco il mio codice

HTML

<!-- tabs link -->
<ul class="nav nav-tabs" id="rowTab">
    <li class="active"><a href="#personal-info" data-toggle="tab">Personal Information</a></li>
    <li><a href="#Employment-info" data-toggle="tab">Employment Information</a></li>
    <li><a href="#career-path" data-toggle="tab">Career Path</a></li>
    <li><a href="#warnings" data-toggle="tab">Warning</a></li>
</ul>
<!-- end: tabs link -->

<div class="tab-content">
    <div class="tab-pane active" id="personal-info">
        tab data here...
    </div>

    <div class="tab-pane" id="Employment-info">
        tab data here...
    </div>

    <div class="tab-pane" id="career-path">
        tab data here...
    </div>

    <div class="tab-pane" id="warnings">
        tab data here...
    </div>
</div>

Javascript :

// tab
$('#rowTab a:first').tab('show');

//for bootstrap 3 use 'shown.bs.tab' instead of 'shown' in the next line
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
//save the latest tab; use cookies if you like 'em better:
localStorage.setItem('selectedTab', $(e.target).attr('id'));
});

//go to the latest tab, if it exists:
var selectedTab = localStorage.getItem('selectedTab');
if (selectedTab) {
  $('#'+selectedTab).tab('show');
}

Il motivo per cui non funziona è perché non memorizza la scheda selezionata. Quando l'ho fatto console.log("selectedTab::"+selectedTab);, ho ricevuto: selectedTab::undefined. Quindi la logica che hai applicato non è corretta
The Dark Knight

Quindi puoi guidarmi per favore cosa fare?
Code Lover

Sto cercando di risolverlo. Se lo faccio, posterò la risposta qui per te
Il cavaliere oscuro,

Lo apprezzo .. grazie per l'aiuto ..
Code Lover

Penso che funzionerà: jsbin.com/UNuYoHE/2/edit . Se mi fa sapere, posterò la risposta in modo nitido. Potresti anche voler guardare i testi della scheda div. non danno la risposta corretta quando si fa clic su di essi. Ad esempio, se fai clic su tab4, ottieni il testo tab1.
The Dark Knight

Risposte:


187

Preferisco memorizzare la scheda selezionata nel valore hash della finestra. Ciò consente anche l'invio di link ai colleghi, che vedono la "stessa" pagina. Il trucco sta nel modificare l'hash della posizione quando viene selezionata un'altra scheda. Se usi già # nella tua pagina, probabilmente il tag hash deve essere diviso. Nella mia app, utilizzo ":" come separatore di valori hash.

<ul class="nav nav-tabs" id="myTab">
  <li class="active"><a href="#home">Home</a></li>
  <li><a href="#profile">Profile</a></li>
  <li><a href="#messages">Messages</a></li>
  <li><a href="#settings">Settings</a></li>
</ul>

<div class="tab-content">
  <div class="tab-pane active" id="home">home</div>
  <div class="tab-pane" id="profile">profile</div>
  <div class="tab-pane" id="messages">messages</div>
  <div class="tab-pane" id="settings">settings</div>
</div>

JavaScript, deve essere incorporato dopo quanto sopra in una <script>...</script>parte.

$('#myTab a').click(function(e) {
  e.preventDefault();
  $(this).tab('show');
});

// store the currently selected tab in the hash value
$("ul.nav-tabs > li > a").on("shown.bs.tab", function(e) {
  var id = $(e.target).attr("href").substr(1);
  window.location.hash = id;
});

// on load of the page: switch to the currently selected tab
var hash = window.location.hash;
$('#myTab a[href="' + hash + '"]').tab('show');

Nella sezione dello script, dovresti aggiungere un punto e virgola alla fine di e.preventDefault();e$(this).tab('show');
Sean Adams-Hiett

12
Sfortunatamente il browser passa al contenuto della scheda quando fai clic su di esso. Questo è il comportamento predefinito quando si imposta il valore window.location.hash. Un'alternativa potrebbe essere l'utilizzo di push.state ma è necessario un polyfill per IE <= 9. Per ulteriori informazioni e altre soluzioni alternative dai un'occhiata a stackoverflow.com/questions/3870057/…
Philipp Michael

3
C'è un modo per impedire il "finto scorrimento" all'id in questione quando si fa clic sull'elemento?
Patrice Poliquin

1
Lo scorrimento è dovuto all'id assegnato alle pagine della scheda. Se usi ID semantici e maneggi l'hash (cioè aggiungi prefisso / suffisso) non verrà riconosciuto come un id valido e non avverrà alcuno scorrimento. Espanderà la risposta con questo.
Alex Mazzariol

1
@koppor funziona ma quando salto direttamente sull'altra scheda salvata (tramite link) visualizza la scheda home o la prima scheda rapidamente circa 1 secondo prima di saltare alla scheda nel collegamento .. Qualche idea per impedire che visualizzi la prima scheda dato che non è necessario?
mboy

135

Questo è il migliore che ho provato:

$(document).ready(function() {
    if (location.hash) {
        $("a[href='" + location.hash + "']").tab("show");
    }
    $(document.body).on("click", "a[data-toggle='tab']", function(event) {
        location.hash = this.getAttribute("href");
    });
});
$(window).on("popstate", function() {
    var anchor = location.hash || $("a[data-toggle='tab']").first().attr("href");
    $("a[href='" + anchor + "']").tab("show");
});

20
Questo funziona meglio della soluzione accettata (Per meglio intendo: copia e incolla funziona: D)
Cyril Duchon-Doris

3
miglior copia e incolla di sempre: P
Ghostff

1
Penso che cambiare il selettore in "a[data-toggle=tab]"sarebbe meglio. Il modo in cui il selettore è scritto ora cambia anche l'URL del browser quando si fa clic su un collegamento per aprire, ad esempio, un modale.
Leifdenby

5
Potresti voler aggiungere parentesi graffe sul selettore, come 'a [href = "' + location.hash + '"]'. Sono incappato in un errore di sintassi.
asdacap

1
L'uso di questo as-è in conflitto con i menu a discesa Bootstrap (che uso data-toggle="dropdown"e che mi capita di avere sulla stessa pagina con le schede in un caso. Come qualcuno ha suggerito qui, la semplice sostituzione $(document.body).on("click", "a[data-toggle]", function(event) {con ha $(document.body).on("click", "a[data-toggle='tab']", function(event) {fatto il trucco per me.
Jiveman

44

Un mix tra le altre risposte:

  • Nessun salto al clic
  • Risparmia sull'hash della posizione
  • Salva su localStorage (es: per l'invio del modulo)
  • Basta copiare e incollare;)

    if (location.hash) {
      $('a[href=\'' + location.hash + '\']').tab('show');
    }
    var activeTab = localStorage.getItem('activeTab');
    if (activeTab) {
      $('a[href="' + activeTab + '"]').tab('show');
    }
    
    $('body').on('click', 'a[data-toggle=\'tab\']', function (e) {
      e.preventDefault()
      var tab_name = this.getAttribute('href')
      if (history.pushState) {
        history.pushState(null, null, tab_name)
      }
      else {
        location.hash = tab_name
      }
      localStorage.setItem('activeTab', tab_name)
    
      $(this).tab('show');
      return false;
    });
    $(window).on('popstate', function () {
      var anchor = location.hash ||
        $('a[data-toggle=\'tab\']').first().attr('href');
      $('a[href=\'' + anchor + '\']').tab('show');
    });

1
Peccato che ho provato prima le altre soluzioni: questa funziona meglio!
tdc

2
La migliore soluzione che ho provato da molti diversi. Il passaggio al contenuto della scheda è stato fastidioso
kentor

4
Il salto di contenuto è ancora lì con questa risposta
shazyriver

2
Ottima soluzione: copia, incolla, vai a pranzo. Bello.
Gary Stanton

1
La migliore soluzione di sempre
fortunato

19

Il codice di Xavi funzionava quasi completamente. Ma durante la navigazione in un'altra pagina, l'invio di un modulo e il reindirizzamento alla pagina con le mie schede non caricava affatto la scheda salvata.

localStorage to the rescue (codice di Nguyen leggermente modificato):

$('a[data-toggle="tab"]').click(function (e) {
    e.preventDefault();
    $(this).tab('show');
});

$('a[data-toggle="tab"]').on("shown.bs.tab", function (e) {
    var id = $(e.target).attr("href");
    localStorage.setItem('selectedTab', id)
});

var selectedTab = localStorage.getItem('selectedTab');
if (selectedTab != null) {
    $('a[data-toggle="tab"][href="' + selectedTab + '"]').tab('show');
}

2
Questo è oro! Funziona anche con i modali! Bella risposta.
Lech Osiński

2
Questo codice è fantastico e funziona alla grande se si desidera che la scheda rimanga selezionata anche se l'utente lascia il sito (termina la sessione) e torna più tardi. Per fare in modo che la selezione persista solo durante la sessione corrente e torni alla scheda predefinita nella sessione successiva, sostituire le due istanze di "localStorage" con "sessionStorage".
Gary

Breve, dolce soluzione copia / incolla che funziona alla grande con Bootstrap 4.
Supporto CFP

Wow tremenda soluzione!
Jilani A

1
[data-toggle="pill"]per le pillole
mxmissile

12

Questo usa HTML5 localStorageper memorizzare la scheda attiva

$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
    localStorage.setItem('activeTab', $(e.target).attr('href'));
});
var activeTab = localStorage.getItem('activeTab');
if (activeTab) {
   $('#navtab-container a[href="' + activeTab + '"]').tab('show');
}

rif: http://www.tutorialrepublic.com/faq/how-to-keep-the-current-tab-active-on-page-reload-in-bootstrap.php https://www.w3schools.com/bootstrap /bootstrap_ref_js_tab.asp


questo è carino, ma uno svantaggio è che non saresti in grado di condividere i link con la scheda attiva
lfender6445

questo è carino, il vantaggio è che non introduce problemi in cui "window.location.hash" aggiunge un valore hash al parametro della richiesta http nell'URL causando collisioni e parametri errati letti da altre richieste http come paginazione, ecc.
Dung

4

Basandomi sulle risposte fornite da Xavi Martínez e koppor ho trovato una soluzione che utilizza l'hash dell'url o localStorage a seconda della disponibilità di quest'ultimo:

function rememberTabSelection(tabPaneSelector, useHash) {
    var key = 'selectedTabFor' + tabPaneSelector;
    if(get(key)) 
        $(tabPaneSelector).find('a[href=' + get(key) + ']').tab('show');

    $(tabPaneSelector).on("click", 'a[data-toggle]', function(event) {
        set(key, this.getAttribute('href'));
    }); 

    function get(key) {
        return useHash ? location.hash: localStorage.getItem(key);
    }

    function set(key, value){
        if(useHash)
            location.hash = value;
        else
            localStorage.setItem(key, value);
    }
}

Uso:

$(document).ready(function () {
    rememberTabSelection('#rowTab', !localStorage);
    // Do Work...
});

Non tiene il passo con il pulsante Indietro come nel caso della soluzione di Xavi Martínez .


4

Il mio codice, funziona per me, io uso localStorageHTML5

$('#tabHistory  a').click(function(e) {
  e.preventDefault();
  $(this).tab('show');
});
$("ul.nav-tabs#tabHistory > li > a").on("shown.bs.tab", function(e) {
  var id = $(e.target).attr("href");
  localStorage.setItem('selectedTab', id)
});
var selectedTab = localStorage.getItem('selectedTab');
$('#tabHistory a[href="' + selectedTab + '"]').tab('show');

4

Ho provato questo e funziona: (Si prega di sostituire questo con la pillola o la scheda che si sta utilizzando)

    jQuery(document).ready(function() {
        jQuery('a[data-toggle="pill"]').on('show.bs.tab', function(e) {
            localStorage.setItem('activeTab', jQuery(e.target).attr('href'));
        });

        // Here, save the index to which the tab corresponds. You can see it 
        // in the chrome dev tool.
        var activeTab = localStorage.getItem('activeTab');

        // In the console you will be shown the tab where you made the last 
        // click and the save to "activeTab". I leave the console for you to 
        // see. And when you refresh the browser, the last one where you 
        // clicked will be active.
        console.log(activeTab);

        if (activeTab) {
           jQuery('a[href="' + activeTab + '"]').tab('show');
        }
    });

Spero possa aiutare qualcuno.

Ecco il risultato: https://jsfiddle.net/neilbannet/ego1ncr5/5/


4

Bene, questo è già nel 2018 ma penso che sia meglio tardi che mai (come un titolo in un programma televisivo), lol. Di seguito il codice jQuery che creo durante la mia tesi.

<script type="text/javascript">
$(document).ready(function(){
    $('a[data-toggle="tab"]').on('show.affectedDiv.tab', function(e) {
        localStorage.setItem('activeTab', $(e.target).attr('href'));
    });
    var activeTab = localStorage.getItem('activeTab');
    if(activeTab){
        $('#myTab a[href="' + activeTab + '"]').tab('show');
    }
});
</script>

ed ecco il codice per le schede bootstrap:

<div class="affectedDiv">
    <ul class="nav nav-tabs" id="myTab">
        <li class="active"><a data-toggle="tab" href="#sectionA">Section A</a></li>
        <li><a data-toggle="tab" href="#sectionB">Section B</a></li>
        <li><a data-toggle="tab" href="#sectionC">Section C</a></li>
    </ul>
    <div class="tab-content">
        <div id="sectionA" class="tab-pane fade in active">
            <h3>Section A</h3>
            <p>Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui. Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth.</p>
        </div>
        <div id="sectionB" class="tab-pane fade">
            <h3>Section B</h3>
            <p>Vestibulum nec erat eu nulla rhoncus fringilla ut non neque. Vivamus nibh urna, ornare id gravida ut, mollis a magna. Aliquam porttitor condimentum nisi, eu viverra ipsum porta ut. Nam hendrerit bibendum turpis, sed molestie mi fermentum id. Aenean volutpat velit sem. Sed consequat ante in rutrum convallis. Nunc facilisis leo at faucibus adipiscing.</p>
        </div>
        <div id="sectionC" class="tab-pane fade">
            <h3>Section C</h3>
            <p>Vestibulum nec erat eu nulla rhoncus fringilla ut non neque. Vivamus nibh urna, ornare id gravida ut, mollis a magna. Aliquam porttitor condimentum nisi, eu viverra ipsum porta ut. Nam hendrerit bibendum turpis, sed molestie mi fermentum id. Aenean volutpat velit sem. Sed consequat ante in rutrum convallis. Nunc facilisis leo at faucibus adipiscing.</p>
        </div>
    </div>
</div>


Non dimenticare di chiamare il bootstrap e altre cose fondamentali 

ecco i codici rapidi per te:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>


Veniamo ora alla spiegazione:

Il codice jQuery nell'esempio precedente ottiene semplicemente il valore dell'attributo href dell'elemento quando una nuova scheda è stata mostrata utilizzando il metodo jQuery .attr () e lo salva localmente nel browser dell'utente tramite l'oggetto localStorage HTML5. Successivamente, quando l'utente aggiorna la pagina, recupera questi dati e attiva la relativa scheda tramite il metodo .tab ('show').

Cerchi alcuni esempi? eccone uno per voi ragazzi .. https://jsfiddle.net/Wineson123/brseabdr/

Vorrei che la mia risposta potesse aiutare tutti voi .. Cheerio! :)


2

Dato che non posso ancora commentare, ho copiato la risposta dall'alto, mi ha davvero aiutato. Ma l'ho cambiato per funzionare con i cookie invece di #id, quindi volevo condividere le modifiche. Ciò rende possibile memorizzare la scheda attiva più a lungo di un solo aggiornamento (es. Reindirizzamento multiplo) o quando l'id è già utilizzato e non si desidera implementare il metodo split di koppors.

<ul class="nav nav-tabs" id="myTab">
    <li class="active"><a href="#home">Home</a></li>
    <li><a href="#profile">Profile</a></li>
    <li><a href="#messages">Messages</a></li>
    <li><a href="#settings">Settings</a></li>
</ul>

<div class="tab-content">
    <div class="tab-pane active" id="home">home</div>
    <div class="tab-pane" id="profile">profile</div>
    <div class="tab-pane" id="messages">messages</div>
    <div class="tab-pane" id="settings">settings</div>
</div>

<script>
$('#myTab a').click(function (e) {
    e.preventDefault();
    $(this).tab('show');
});

// store the currently selected tab in the hash value
$("ul.nav-tabs > li > a").on("shown.bs.tab", function (e) {
    var id = $(e.target).attr("href").substr(1);
    $.cookie('activeTab', id);
});

    // on load of the page: switch to the currently selected tab
    var hash = $.cookie('activeTab');
    if (hash != null) {
        $('#myTab a[href="#' + hash + '"]').tab('show');
    }
</script>

Grazie per l'aggiornamento. In realtà stavo cercando una tale risoluzione ma rispetto al tempo che volevo ho ottenuto solo la risposta @koppor come una risposta funzionante. In effetti questo è uno dei modi migliori per utilizzare la funzionalità di ritorno. Grazie per l'aggiornamento
Code Lover

2

Ho provato il codice offerto da Xavi Martínez . Ha funzionato ma non per IE7. Il problema è che le schede non fanno riferimento a contenuti pertinenti.
Quindi, preferisco questo codice per risolvere il problema.

function pageLoad() {
  $(document).ready(function() {

    var tabCookieName = "ui-tabs-1"; //cookie name
    var location = $.cookie(tabCookieName); //take tab's href

    if (location) {
      $('#Tabs a[href="' + location + '"]').tab('show'); //activate tab
    }

    $('#Tabs a').click(function(e) {
      e.preventDefault()
      $(this).tab('show')
    })

    //when content is alredy shown - event activate 
    $('#Tabs a').on('shown.bs.tab', function(e) {
      location = e.target.hash; // take current href
      $.cookie(tabCookieName, location, {
        path: '/'
      }); //write href in cookie
    })
  });
};

questo è carino, ma uno svantaggio è che non saresti in grado di condividere i link con la scheda attiva
lfender6445

1

Grazie per la condivisione.

Leggendo tutte le soluzioni. Ho trovato una soluzione che utilizza l'hash dell'URL o localStorage a seconda della disponibilità di quest'ultimo con il codice seguente:

$(function(){
    $(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) {
        localStorage.setItem('activeTab', $(e.target).attr('href'));
    })

    var hash = window.location.hash;
    var activeTab = localStorage.getItem('activeTab');

    if(hash){
          $('#project-tabs  a[href="' + hash + '"]').tab('show');   
    }else if (activeTab){
        $('#project-tabs a[href="' + activeTab + '"]').tab('show');
    }
});

1

Per Bootstrap v4.3.1. Prova di seguito:

$(document).ready(function() {
    var pathname = window.location.pathname; //get the path of current page
    $('.navbar-nav > li > a[href="'+pathname+'"]').parent().addClass('active');
})

0

Usando html5 ho creato questo:

Alcuni dove sulla pagina:

<h2 id="heading" data-activetab="@ViewBag.activetab">Some random text</h2>

La viewbag dovrebbe contenere solo l'id della pagina / elemento, ad esempio: "testing"

Ho creato un site.js e ho aggiunto lo script sulla pagina:

/// <reference path="../jquery-2.1.0.js" />
$(document).ready(
  function() {
    var setactive = $("#heading").data("activetab");
    var a = $('#' + setactive).addClass("active");
  }
)

Ora tutto ciò che devi fare è aggiungere i tuoi ID alla tua barra di navigazione. Per esempio.:

<ul class="nav navbar-nav">
  <li **id="testing" **>
    @Html.ActionLink("Lalala", "MyAction", "MyController")
  </li>
</ul>

Tutti salutano l'attributo dei dati :)


0

Oltre alla risposta di Xavi Martínez evitando il salto al clic

Evitare il salto

$(document).ready(function(){

    // show active tab

    if(location.hash) {

        $('a[href=' + location.hash + ']').tab('show');
    }

    // set hash on click without jumb

    $(document.body).on("click", "a[data-toggle]", function(e) {

        e.preventDefault();

        if(history.pushState) {

            history.pushState(null, null, this.getAttribute("href"));
        }
        else {

            location.hash = this.getAttribute("href");
        }

        $('a[href=' + location.hash + ']').tab('show');

        return false;
    });
});

// set hash on popstate

$(window).on('popstate', function() {

    var anchor = location.hash || $("a[data-toggle=tab]").first().attr("href");

    $('a[href=' + anchor + ']').tab('show');
});

Schede nidificate

implementazione con carattere "_" come separatore

$(document).ready(function(){

    // show active tab

    if(location.hash) {

        var tabs = location.hash.substring(1).split('_');

        $.each(tabs,function(n){

            $('a[href=#' + tabs[n] + ']').tab('show');
        });         

        $('a[href=' + location.hash + ']').tab('show');
    }

    // set hash on click without jumb

    $(document.body).on("click", "a[data-toggle]", function(e) {

        e.preventDefault();

        if(history.pushState) {

            history.pushState(null, null, this.getAttribute("href"));
        }
        else {

            location.hash = this.getAttribute("href");
        }

        var tabs = location.hash.substring(1).split('_');

        //console.log(tabs);

        $.each(tabs,function(n){

            $('a[href=#' + tabs[n] + ']').tab('show');
        });

        $('a[href=' + location.hash + ']').tab('show');

        return false;
    });
});

// set hash on popstate

$(window).on('popstate', function() {

    var anchor = location.hash || $("a[data-toggle=tab]").first().attr("href");

    var tabs = anchor.substring(1).split('_');

    $.each(tabs,function(n){

        $('a[href=#' + tabs[n] + ']').tab('show');
    });

    $('a[href=' + anchor + ']').tab('show');
});

0

Abbiamo usato il trigger jquery per caricare uno script che preme il pulsante per noi

$ ( "Nome_classe"). Trigger ( 'click').;


0

Guai, ci sono così tanti modi per farlo. Mi è venuto in mente questo, breve e semplice. Spero che questo aiuti gli altri.

  var url = document.location.toString();
  if (url.match('#')) {
    $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
  } 

  $('.nav-tabs a').on('shown.bs.tab', function (e) {
    window.location.hash = e.target.hash;
    if(e.target.hash == "#activity"){
      $('.nano').nanoScroller();
    }
  })

0

C'è una soluzione dopo aver ricaricato la pagina e aver mantenuto la scheda prevista come selezionata.

Supponiamo che dopo aver salvato i dati l'URL reindirizzato sia: my_url # tab_2

Ora tramite il seguente script la scheda prevista rimarrà selezionata.

$(document).ready(function(){
    var url = document.location.toString();
    if (url.match('#')) {
        $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
        $('.nav-tabs a').removeClass('active');
    }
});

La classe attiva viene assegnata automaticamente al tag di ancoraggio, quindi viene rimossa da $ ('. Nav-tabs a'). RemoveClass ('active'); questo script.
Hasib Kamal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.