Bir sayfa yeniden yüklendikten sonra geçerli sekmeyi twitter önyüklemesi ile nasıl aktif tutabilirim?


87

Şu anda Twitter Bootstrap ile sekmeler kullanıyorum ve bir kullanıcı veri gönderdikten ve sayfa yeniden yüklendikten sonra aynı sekmeyi seçmek istiyorum.

Bu nasıl yapılır?

Sekmeleri açmak için şu anki çağrım şu şekilde görünüyor:

<script type="text/javascript">

$(document).ready(function() {

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

Sekmelerim:

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


Yanıtlar:


138

Bunu yönetmek için localStorage veya tanımlama bilgileri kullanmanız gerekecek. İşte büyük ölçüde iyileştirilebilecek hızlı ve kirli bir çözüm, ancak size bir başlangıç ​​noktası verebilir:

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

güzel bir tomurcuk, çözümünüz joomla 30 core, joomlacode.org/gf/project/joomla/tracker/…
Benn

12
Daha iyi kullanım $(this).attr('href')yerine $(e.target).attr('id')size tam url olmadan karma verir. Ayrıca .tab(), a etiketinin data-toggle="tab"yerine $('#'+lastTab). Ayrıca bakınız: stackoverflow.com/questions/16808205/…
Bass Jobsen

3
Önyükleme 3'te yöntem biraz değişiyor showngibi görünüyor. Artık işe yaramıyor, olarak değiştirmek zorunda kaldı shown.bs.tab. Not: Javascript ve diğerlerini, ekonomiyi de anladığım kadar anlıyorum ... bu yüzden ne olduğunu bilen biri beni düzeltmekten çekinmeyin.
Chaz

10
Birden çok sekme denetimi (ve Bootstrap 3) ile çalışacak şekilde değiştirildi: gist.github.com/brendanmckenzie/8f8008d3d51c07b2700f
Brendan

1
İlk sekmeye gidecek ve yenilemeden sonra mevcut sekmeye geri dönecek
Raviteja

23

Çerezleri kullanarak çalışmasını ve ayrıca diğer sekmelerden ve sekme bölmelerinden 'etkin' sınıfı kaldırıp 'etkin' sınıfı geçerli sekme ve sekme bölmesine eklemesini sağladı.

Eminim bunu yapmanın daha iyi bir yolu vardır, ancak bu durumda bu işe yarıyor gibi görünüyor.

JQuery çerez eklentisi gerektirir.

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

Mantıklı görünmesine rağmen localStorage çözümünün çalışmasını sağlayamadım. Kutudan çıkan bu çözüm ve $ .cookie eklentisine sahip olmak ÇOK kullanışlıdır.
Michael J. Calkins

sınıfları kaldırmak ve eklemek yerine data-toggle = "tab" içeren bir etikete .tab () uygulayın ayrıca bkz .: stackoverflow.com/questions/16808205/…
Bass Jobsen

Düzenim için, div'ler için 'fade in active' kullandığım için son iki satırı 'in active' eklemek veya kaldırmak için değiştirmem gerekiyordu.
Obromios

18

Diğer tüm cevaplar doğrudur. Bu cevap, birinin birden fazla ul.nav.nav-pillsveya ul.nav.nav-tabsaynı sayfada olabileceği gerçeğini dikkate alacaktır . Bu durumda önceki cevaplar başarısız olacaktır.

Hala kullanılıyor localStorageama JSONdeğer olarak dizgeli . İşte kod:

$(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");
    }
  });
});

Bu bit, uygulamanın tamamında tüm sayfalarda kullanılabilir ve hem sekmeler hem de haplar için çalışacaktır. Ayrıca, sekmelerin veya hapların varsayılan olarak aktif olmadığından emin olun , aksi takdirde sayfa yüklenirken titreme etkisi göreceksiniz.

Önemli : Ebeveynin ulbir kimliği olduğundan emin olun . Teşekkürler Alain


2
Ayrıca, BS3 için 'gösterilen' etkinliğini 'shown.bs.tab' ile değiştirin
Alain

18

En iyi seçenek için şu tekniği kullanın:

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

Seçili sekmeyi pencerenin hash değerinde saklamayı tercih ederim. Bu aynı zamanda "aynı" sayfayı gören meslektaşlara bağlantı gönderilmesini de sağlar. İşin püf noktası, başka bir sekme seçildiğinde konumun karmasını değiştirmektir. Sayfanızda zaten # kullanıyorsanız, muhtemelen hash etiketinin bölünmesi gerekir. Uygulamamda, karma değer ayırıcısı olarak ":" kullanıyorum.

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

Bu cevap için teşekkür ederim. Benim için iyi çalışıyor ve sadece bu problem için çerezlerle uğraşmak istemedim, bu yüzden harika.
nico008

@koppor, bu işe yaramıyor bir postback olayı var. link <asp:LinkButton CssClass="form-search" ID="LinkButtonSearch" runat="server">Search</asp:LinkButton> butonunu ekledim, butona tıkladıktan sonra aktif hale gelen mevcut sekme değil varsayılan sekmedir. bunu nasıl düzeltebilirim?
Djama

6

Sayfanın ilk sekmede ve ardından çerez tarafından kaydedilen sekmede yanıp sönmesini önlemek için (bu, ilk SEKME'de varsayılan olarak "etkin" sınıfı belirlediğinizde gerçekleşir)

Aşağıdaki gibi sekmelerin ve bölmelerin "etkin" sınıfını kaldırın:

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

İlk sekmeyi varsayılan gibi ayarlamak için aşağıdaki komut dosyasını yerleştirin (jQuery çerez eklentisi gerektirir)

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

Solma efekti ister misiniz? @ Oktav kodunun güncellenmiş sürümü:

  1. Bootstrap 3 için
  2. Soldurmanın düzgün çalışmasını sağlamak için li ve tab'ın divindeki sınıfları ayarlar. Tüm içerik bölümlerininclass="tab-pane fade"

Kod:

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

Birden çok sayfada sekmelerim vardı ve localStorage, lastTab'i önceki sayfalardan da saklıyor, bu nedenle sonraki sayfada, önceki sayfanın son sekmesi depoda olduğundan, burada eşleşen herhangi bir sekme bulamadı, bu nedenle hiçbir şey görüntülenmiyordu. Bu şekilde değiştirdim.

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

düzenleme:lastTab Farklı sayfalar için farklı değişken adlarına sahip olmam gerektiğini fark ettim , aksi takdirde her zaman birbirlerinin üzerine yazacaklar. örneğin lastTab_klanten, lastTab_bestellingeniki farklı sayfa için klantenve bestellingenher ikisi de sekmelerde görüntülenen verilere sahip.

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

@Dgabriel ile benzer bir çözümle çalışmasını sağladım, bu durumda bağlantılara <a>ihtiyaç duymuyor id, mevcut sekmeyi konuma göre belirliyor.

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

Kodunuzun getItem'in gösterilmeden önce yanlış bir şekilde olduğunu düşünüyorum, ayrıca indexTab'ı iki kez bildirme sorununu çözüyor.
John Magnolia

@JohnMagnolia indexTabİki kez adlandırdım ama bir fark. indeks. O yüzden 2. olanı arayacağım lastIndexTab. shownBununla ilgili olarak , bu bir olaydır, bu nedenle siz bir sekme açana kadar tetiklenmez, bu nedenle önceden olup olmadığı önemli değildir getItem.
Jaider

1

Aşağıdaki değişiklikleri öneririm

  1. Yerleşik yedekler ile çapraz tarayıcı / platformlar arası yerel depolama API'si sağlayan amplify.store gibi bir eklenti kullanın .

  2. $('#div a[data-toggle="tab"]')Bu işlevi aynı sayfada bulunan birden çok sekme kapsayıcısına genişletmek için kaydedilmesi gereken sekmeyi hedefleyin .

  3. (url ??)Birden çok sayfada son kullanılan sekmeleri kaydetmek ve geri yüklemek için benzersiz bir tanımlayıcı kullanın .


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

Yerel depolama olmadan basit çözüm:

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

0

Sunucu tarafı yaklaşımı. Belirtilmemesi durumunda tüm html öğelerinin class = "" içerdiğinden emin olun, aksi takdirde null değerleri işlemeniz gerekir.

    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

İlk sekmeyi sayfaya ilk girdiğinizde göstermek istiyorsanız şu kodu kullanın:

    <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

İşte Bootstrap 3 ve jQuery ile ve farklı sekmeler içeren farklı URL'lerle çalışan yaptığım bir snippet . Yine de sayfa başına birden fazla sekmeyi desteklemez, ancak bu özelliğe ihtiyacınız varsa, kolay bir değişiklik olmalıdır.

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

$ (belge) .ready (işlev () {

        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

sayfada birden fazla sekmeniz varsa, aşağıdaki kodu kullanabilirsiniz

<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

Bu, sekmeleri yeniler, ancak yalnızca denetleyicideki her şey yüklendikten sonra.

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

Bunu MVC ile kullanıyorum:

  • Modelde, değeri POST yöntemine göndermek için bir SelectedTab tamsayı alanı vardır.

JavaScript Bölümü:

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

HTML Bölümü:

@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>
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.