Come faccio a mantenere attiva la scheda corrente con il bootstrap di Twitter dopo il ricaricamento di una pagina?


87

Attualmente sto utilizzando le schede con Twitter Bootstrap e desidero selezionare la stessa scheda dopo che un utente ha pubblicato i dati e la pagina viene ricaricata.

Come si fa?

La mia attuale chiamata a inti the tabs è simile a questa:

<script type="text/javascript">

$(document).ready(function() {

    $('#profileTabs a:first').tab('show');
});
</script>

Le mie schede:

<ul id="profileTabs" class="nav nav-tabs">
    <li class="active"><a href="#profile" data-toggle="tab">Profile</a></li>
    <li><a href="#about" data-toggle="tab">About Me</a></li>
    <li><a href="#match" data-toggle="tab">My Match</a></li>
</ul>

1
Questa sembra essere una domanda duplicato stackoverflow.com/questions/18999501/...~~V~~singular~~3rd
koppor

Risposte:


138

Dovrai utilizzare localStorage o cookie per gestirlo. Ecco una soluzione rapida e sporca che può essere notevolmente migliorata, ma potrebbe darti un punto di partenza:

$(function() { 
    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use '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('lastTab', $(this).attr('href'));
    });

    // go to the latest tab, if it exists:
    var lastTab = localStorage.getItem('lastTab');
    if (lastTab) {
        $('[href="' + lastTab + '"]').tab('show');
    }
});

bel bocciolo, la tua soluzione potrebbe essere aggiunta in joomla 30 core, joomlacode.org/gf/project/joomla/tracker/…
Benn

12
uso migliore $(this).attr('href')invece di quello $(e.target).attr('id')che ti dà l'hash senza l'url completo. Devi anche applicare il .tab()tag sul a con data-toggle="tab"al posto di $('#'+lastTab). Vedi anche: stackoverflow.com/questions/16808205/...
Bass Jobsen

3
Sembra che il metodo cambi leggermente in Bootstrap 3. shownnon sembra più funzionare, ho dovuto cambiarlo in shown.bs.tab. Nota: capisco javascript e altri e anche l'economia ... quindi qualcuno che sa cosa succede non esitate a correggermi.
Chaz

10
Modificato per funzionare con più controlli scheda (e Bootstrap 3): gist.github.com/brendanmckenzie/8f8008d3d51c07b2700f
Brendan

1
Andrà

23

È riuscito a farlo funzionare utilizzando i cookie e anche rimuovendo la classe "attiva" da qualsiasi altra scheda e pannello delle schede ... e aggiungendo la classe "attiva" alla scheda e al riquadro delle schede correnti.

Sono sicuro che ci sia un modo migliore per farlo, ma in questo caso sembra funzionare.

Richiede il plug-in cookie jQuery.

$(function() { 
  $('a[data-toggle="tab"]').on('shown', function(e){
    //save the latest tab using a cookie:
    $.cookie('last_tab', $(e.target).attr('href'));
  });

  //activate latest tab, if it exists:
  var lastTab = $.cookie('last_tab');
  if (lastTab) {
      $('ul.nav-tabs').children().removeClass('active');
      $('a[href='+ lastTab +']').parents('li:first').addClass('active');
      $('div.tab-content').children().removeClass('active');
      $(lastTab).addClass('active');
  }
});

Non sono riuscito a far funzionare la soluzione localStorage anche se sembrava logico. Questa soluzione pronta all'uso e il plug-in $ .cookie è MOLTO utile da avere.
Michael J. Calkins,

applicare .tab () sul un'etichetta con i dati a ginocchiera = "scheda" anziché rimuovere e aggiungendo classi vedi anche: stackoverflow.com/questions/16808205/...
Bass Jobsen

Per il mio layout, poiché stavo usando "fade in active" per i div, era necessario modificare le ultime due righe per aggiungere o rimuovere "in active".
Obromios,

18

Tutte le altre risposte sono corrette. Questa risposta terrà conto del fatto che uno potrebbe avere più ul.nav.nav-pillso ul.nav.nav-tabssulla stessa pagina. In questo caso, le risposte precedenti falliranno.

Ancora in uso localStoragema con una stringa JSONcome valore. Ecco il codice:

$(function() {
  var json, tabsState;
  $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown', function(e) {
    var href, json, parentId, tabsState;

    tabsState = localStorage.getItem("tabs-state");
    json = JSON.parse(tabsState || "{}");
    parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id");
    href = $(e.target).attr('href');
    json[parentId] = href;

    return localStorage.setItem("tabs-state", JSON.stringify(json));
  });

  tabsState = localStorage.getItem("tabs-state");
  json = JSON.parse(tabsState || "{}");

  $.each(json, function(containerId, href) {
    return $("#" + containerId + " a[href=" + href + "]").tab('show');
  });

  $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() {
    var $this = $(this);
    if (!json[$this.attr("id")]) {
      return $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first").tab("show");
    }
  });
});

Questo bit può essere utilizzato sull'intera app su tutte le pagine e funzionerà sia per le schede che per le pillole. Inoltre, assicurati che le schede o le pillole non siano attive per impostazione predefinita , altrimenti vedrai un effetto di sfarfallio al caricamento della pagina.

Importante : assicurati che il genitore ulabbia un ID. Grazie Alain


2
Inoltre, per BS3, sostituire l'evento 'mostrato' con 'mostrato.bs.tab'
Alain

18

Per l'opzione migliore, usa questa tecnica:

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

  //go to the latest tab, if it exists:
  var lastTab = localStorage.getItem('lastTab');

  if (lastTab) {
    $('a[href="'+lastTab+'"]').click();
  }
});

12

Preferisco memorizzare la scheda selezionata nel valore hash della finestra. Ciò consente anche l'invio di collegamenti 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>

<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);
        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');
</script>

Grazie per questa risposta. Funziona bene per me e non volevo occuparmi dei cookie solo per questo problema, quindi è fantastico.
nico008

@koppor, non funziona c'è un evento di postback. ho aggiunto il pulsante di collegamento <asp:LinkButton CssClass="form-search" ID="LinkButtonSearch" runat="server">Search</asp:LinkButton> , dopo aver cliccato sul pulsante, è la scheda predefinita che diventa attiva non la scheda corrente. come posso risolverlo ??
Djama

6

Per evitare che la pagina lampeggi sulla prima scheda e poi sulla scheda che è stata salvata dal cookie (questo avviene quando si determina la classe "attiva" di default nel primo TAB)

Rimuovi la classe "attiva" di schede e riquadri come:

<ul class="nav nav-tabs">
<div id="p1" class="tab-pane">

Inserisci lo script di seguito per impostare la prima scheda come predefinita (richiede il plug-in cookie jQuery)

    $(function() { 
        $('a[data-toggle="tab"]').on('shown', function(e){
            //save the latest tab using a cookie:
            $.cookie('last_tab', $(e.target).attr('href'));
        });
        //activate latest tab, if it exists:
        var lastTab = $.cookie('last_tab');
        if (lastTab) {
            $('a[href=' + lastTab + ']').tab('show');
        }
        else
        {
            // Set the first tab if cookie do not exist
            $('a[data-toggle="tab"]:first').tab('show');
        }
    });

3

Vuoi effetto dissolvenza? Versione aggiornata del codice di @ Oktav:

  1. Per Bootstrap 3
  2. Imposta le classi sul div li e tab per consentire il corretto funzionamento della dissolvenza. Tieni presente che tutti i div di contenuto hanno bisognoclass="tab-pane fade"

Codice:

// See http://stackoverflow.com/a/16984739/64904
// Updated by Larry to setup for fading
$(function() {
  var json, tabsState;
  $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
    var href, json, parentId, tabsState;
    tabsState = localStorage.getItem("tabs-state");
    json = JSON.parse(tabsState || "{}");
    parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id");
    href = $(e.target).attr('href');
    json[parentId] = href;
    return localStorage.setItem("tabs-state", JSON.stringify(json));
  });
  tabsState = localStorage.getItem("tabs-state");
  json = JSON.parse(tabsState || "{}");
  $.each(json, function(containerId, href) {
    var a_el = $("#" + containerId + " a[href=" + href + "]");
    $(a_el).parent().addClass("active");
    $(href).addClass("active in");
    return $(a_el).tab('show');
  });
  $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() {
    var $this = $(this);
    if (!json[$this.attr("id")]) {
      var a_el = $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first"),
          href = $(a_el).attr('href');
      $(a_el).parent().addClass("active");
      $(href).addClass("active in");
      return $(a_el).tab("show");
    }
  });
});

3

Avevo schede in più pagine e localStorage mantiene anche lastTab dalle pagine precedenti, quindi per la pagina successiva, poiché aveva lastTab della pagina precedente in memoria, non ha trovato alcuna scheda corrispondente qui, quindi non veniva visualizzato nulla. L'ho modificato in questo modo.

$(document).ready(function(){
    //console.log($('a[data-toggle="tab"]:first').tab('show'))
    $('a[data-toggle="tab"]').on('shown.bs.tab', function () {
        //save the latest tab; use cookies if you like 'em better:
        localStorage.setItem('lastTab', $(this).attr('href'));
    });

    //go to the latest tab, if it exists:
    var lastTab = localStorage.getItem('lastTab');
    if ($('a[href=' + lastTab + ']').length > 0) {
        $('a[href=' + lastTab + ']').tab('show');
    }
    else
    {
        // Set the first tab if cookie do not exist
        $('a[data-toggle="tab"]:first').tab('show');
    }
})

modifica: ho notato che dovrò avere lastTabnomi di variabili diversi per pagine diverse, altrimenti si sovrascriveranno sempre a vicenda. ad esempio lastTab_klanten, lastTab_bestellingenecc. per due pagine diverse klantened bestellingenentrambe hanno i dati visualizzati in schede.

$(document).ready(function(){
    //console.log($('a[data-toggle="tab"]:first').tab('show'))
    $('a[data-toggle="tab"]').on('shown.bs.tab', function () {
        //save the latest tab; use cookies if you like 'em better:
        localStorage.setItem('lastTab_klanten', $(this).attr('href'));
    });

    //go to the latest tab, if it exists:
    var lastTab_klanten = localStorage.getItem('lastTab_klanten');
    if (lastTab_klanten) {
        $('a[href=' + lastTab_klanten + ']').tab('show');
    }
    else
    {
        // Set the first tab if cookie do not exist
        $('a[data-toggle="tab"]:first').tab('show');
    }
})

3

L'ho fatto funzionare con una soluzione simile a @dgabriel, in questo caso i collegamenti <a>non servono id, identifica la scheda corrente in base alla posizione.

$(function() { 
  $('a[data-toggle="tab"]').on('shown', function (e) {
    var indexTab = $('a[data-toggle="tab"]').index($(this)); // this: current tab anchor
    localStorage.setItem('lastVisitedTabIndex', indexTab);
  });

  //go to the latest tab, if it exists:
  var lastIndexTab  = localStorage.getItem('lastVisitedTabIndex');
  if (lastIndexTab) {
      $('a[data-toggle="tab"]:eq(' + lastIndexTab + ')').tab('show');
  }
});

Penso che il tuo codice sia sbagliato nel senso che getItem dovrebbe essere mostrato prima, risolve anche il problema di dichiarare indexTab due volte.
John Magnolia

@ JohnMagnolia ho chiamato il indexTabdue volte ma è un diff. indice. Quindi chiamerò il secondo lastIndexTab. Riguardo a shown, questo è un evento, quindi non si attiverà finché non apri una scheda, quindi non importa se è prima getItem.
Jaider

1

Suggerisco le seguenti modifiche

  1. Usa un plugin come amplify.store che fornisce un'API localstorage crossbrowser / crossplatform con fallback incorporati.

  2. Scegli come target la scheda che deve essere salvata in $('#div a[data-toggle="tab"]')modo da estendere questa funzionalità a più contenitori di schede presenti sulla stessa pagina.

  3. Utilizza un identificatore univoco (url ??)per salvare e ripristinare le ultime schede utilizzate su più pagine.


$(function() { 
  $('#div a[data-toggle="tab"]').on('shown', function (e) {
    amplify.store(window.location.hostname+'last_used_tab', $(this).attr('href'));
  });

  var lastTab = amplify.store(window.location.hostname+'last_used_tab');
  if (lastTab) {
    $("#div a[href="+ lastTab +"]").tab('show');
  }
});

1

Soluzione semplice senza archiviazione locale:

$(".nav-tabs a").on("click", function() {
    location.hash = $(this).attr("href");
});

0

Approccio lato server. Assicurati che tutti gli elementi html abbiano class = "" nel caso in cui non sia specificato o dovrai gestire i null.

    private void ActiveTab(HtmlGenericControl activeContent, HtmlGenericControl activeTabStrip)
    {
        if (activeContent != null && activeTabStrip != null)
        {
            // Remove active from content
            Content1.Attributes["class"] = Content1.Attributes["class"].Replace("active", "");
            Content2.Attributes["class"] = Content2.Attributes["class"].Replace("active", "");
            Content3.Attributes["class"] = Content3.Attributes["class"].Replace("active", "");

            // Remove active from tab strip
            tabStrip1.Attributes["class"] = tabStrip1.Attributes["class"].Replace("active", "");
            tabStrip2.Attributes["class"] = tabStrip2.Attributes["class"].Replace("active", "");
            tabStrip3.Attributes["class"] = tabStrip3.Attributes["class"].Replace("active", "");

            // Set only active
            activeContent.Attributes["class"] = activeContent.Attributes["class"] + " active";
            activeTabStrip.Attributes["class"] = activeTabStrip.Attributes["class"] + " active";
        }
    }

0

Se vuoi mostrare la prima scheda la prima volta che entri nella pagina usa questo codice:

    <script type="text/javascript">
        function invokeMeMaster() {
        var chkPostBack = '<%= Page.IsPostBack ? "true" : "false" %>';
            if (chkPostBack == 'false') {
                $(function () {
                    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use '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('lastTab', $(this).attr('href'));
                    });

                });
            }
            else {
                $(function () {

                    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use '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('lastTab', $(this).attr('href'));
                    });

                    // go to the latest tab, if it exists:
                    var lastTab = localStorage.getItem('lastTab');
                    if (lastTab) {
                        $('[href="' + lastTab + '"]').tab('show');
                    }

                });

            }
        }
        window.onload = function() { invokeMeMaster(); };

    </script>


0

Ecco uno snippet che ho creato che funziona con Bootstrap 3 e jQuery e con diversi URL contenenti diverse schede . Tuttavia, non supporta più schede per pagina, ma dovrebbe essere una modifica facile se hai bisogno di quella funzione.

/**
 * Handles 'Bootstrap' package.
 *
 * @namespace bootstrap_
 */

/**
 * @var {String}
 */
var bootstrap_uri_to_tab_key = 'bootstrap_uri_to_tab';

/**
 * @return {String}
 */
function bootstrap_get_uri()
{
    return window.location.href;
}

/**
 * @return {Object}
 */
function bootstrap_load_tab_data()
{
    var uriToTab = localStorage.getItem(bootstrap_uri_to_tab_key);
    if (uriToTab) {
    try {
        uriToTab = JSON.parse(uriToTab);
        if (typeof uriToTab != 'object') {
        uriToTab = {};
        }
    } catch (err) {
        uriToTab = {};
    }
    } else {
    uriToTab = {};
    }
    return uriToTab;
}

/**
 * @param {Object} data
 */
function bootstrap_save_tab_data(data)
{
    localStorage.setItem(bootstrap_uri_to_tab_key, JSON.stringify(data));
}

/**
 * @param {String} href
 */
function bootstrap_save_tab(href)
{
    var uri = bootstrap_get_uri();
    var uriToTab = bootstrap_load_tab_data();
    uriToTab[uri] = href;
    bootstrap_save_tab_data(uriToTab);
}

/**
 *
 */
function bootstrap_restore_tab()
{
    var uri = bootstrap_get_uri();
    var uriToTab = bootstrap_load_tab_data();
    if (uriToTab.hasOwnProperty(uri) &&
    $('[href="' + uriToTab[uri] + '"]').length) {
    } else {
    uriToTab[uri] = $('a[data-toggle="tab"]:first').attr('href');
    }
    if (uriToTab[uri]) {
        $('[href="' + uriToTab[uri] + '"]').tab('show');
    }
}

$(document).ready(function() {

    if ($('.nav-tabs').length) {

    // for bootstrap 3 use 'shown.bs.tab', for bootstrap 2 use 'shown' in the next line
    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
        bootstrap_save_tab($(this).attr('href'));
    });
    bootstrap_restore_tab();

    }

});

0

$ (documento) .ready (function () {

        if (JSON.parse(localStorage.getItem('currentClass')) == "active")
        {
            jQuery('#supporttbl').addClass('active')
            $('.sub-menu').css({ "display": "block" });
        }

        $("#supporttbl").click(function () { 
            var currentClass;
            if ($(this).attr('class')== "active") { 

                currentClass = $(this).attr('class');

                localStorage.setItem('currentClass', JSON.stringify(currentClass));
                console.log(JSON.parse(localStorage.getItem('currentClass')));

                jQuery('#supporttbl').addClass('active')
                $('.sub-menu').css({ "display": "block" });

            } else {

                currentClass = "Null"; 

                localStorage.setItem('currentClass', JSON.stringify(currentClass));
                console.log(JSON.parse(localStorage.getItem('currentClass')));

                jQuery('#supporttbl').removeClass('active')
                $('.sub-menu').css({ "display": "none" });

            }  
        });

});


0

se hai più di una scheda nella pagina, puoi usare il seguente codice

<script type="text/javascript">
$(document).ready(function(){
    $('#profileTabs').on('show.bs.tab', function(e) {
        localStorage.setItem('profileactiveTab', $(e.target).attr('href'));
    });
    var profileactiveTab = localStorage.getItem('profileactiveTab');
    if(profileactiveTab){
        $('#profileTabs a[href="' + profileactiveTab + '"]').tab('show');        
    }
    $('#charts-tab').on('show.bs.tab', function(e) {
        localStorage.setItem('chartsactiveTab', $(e.target).attr('href'));
    });
    var chartsactiveTab = localStorage.getItem('chartsactiveTab');
    if(chartsactiveTab){
        $('#charts-tab a[href="' + chartsactiveTab + '"]').tab('show');        
    }     
});
</script>

0

Questo aggiornerà le schede ma solo dopo che tutto è stato caricato nel controller.

// >= angular 1.6 angular.element(function () {
angular.element(document).ready(function () {
    //Here your view content is fully loaded !!
    $('li[href="' + location.hash + '"] a').tab('show');
});

0

Lo sto usando con MVC:

  • È presente un campo intero SelectedTab nel modello per inviare il valore al metodo POST

Sezione JavaScript:

<script type="text/javascript">
    $(document).ready(function () {
       var index = $("input#SelectedTab").val();
       $("#tabstrip > ul li:eq(" + index + ")").addClass("k-state-active");

       $("#tabstrip").kendoTabStrip();
    });
    function setTab(index) {
      $("input#SelectedTab").val(index)
    }
</script>

Sezione HTML:

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.SelectedTab)
<div id="tabstrip">
    <ul>
        <li onclick="setTab(0)">Content 0</li>
        <li onclick="setTab(1)">Content 1</li>
        <li onclick="setTab(2)">Content 2</li>
        <li onclick="setTab(3)">Content 3</li>
        <li onclick="setTab(4)">Content 4</li>
    </ul>
    <div>

    </div>
    <div>

    </div>
    <div>

    </div>
    <div>

    </div>
    <div>

    </div>
</div>
<div class="content">
    <button type="submit" name="save" class="btn bg-blue">Save</button>
</div>
}
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.