请记住刷新后哪个选项卡处于活动状

时间:2010-11-28 22:15:20

标签: jquery jquery-plugins

我正在网页上使用jquery标签,当页面刷新时,它会丢失我曾经使用的标签并返回第一个标签。

有没有人遇到这个问题,知道如何解决它?

17 个答案:

答案 0 :(得分:38)

和其他人一样,我在jQueryUI 1.10中苦苦寻找我的ui-tabs cookie历史。 感谢Harry的解决方案以及我在下面的代码中提到的其他一些在线文档,我现在有了一个有效的非cookie解决方案!我能够在Firefox 18.0.1和IE 9.0.12中进行测试。根据我的资源,Chrome,Firefox,Safari和IE8&以上支持会话存储。

  $(function() {
    //  jQueryUI 1.10 and HTML5 ready
    //      http://jqueryui.com/upgrade-guide/1.10/#removed-cookie-option 
    //  Documentation
    //      http://api.jqueryui.com/tabs/#option-active
    //      http://api.jqueryui.com/tabs/#event-activate
    //      http://balaarjunan.wordpress.com/2010/11/10/html5-session-storage-key-things-to-consider/
    //
    //  Define friendly index name
    var index = 'key';
    //  Define friendly data store name
    var dataStore = window.sessionStorage;
    //  Start magic!
    try {
        // getter: Fetch previous value
        var oldIndex = dataStore.getItem(index);
    } catch(e) {
        // getter: Always default to first tab in error state
        var oldIndex = 0;
    }
    $('#tabs').tabs({
        // The zero-based index of the panel that is active (open)
        active : oldIndex,
        // Triggered after a tab has been activated
        activate : function( event, ui ){
            //  Get future value
            var newIndex = ui.newTab.parent().children().index(ui.newTab);
            //  Set future value
            dataStore.setItem( index, newIndex ) 
        }
    }); 
    }); 

答案 1 :(得分:21)

我假设你使用的是jQuery UI标签,

以下是使用制表符+ Cookie保存最后点击的标签

的示例

http://jqueryui.com/demos/tabs/#cookie

演示: 打开这个链接 http://jqueryui.com/demos/tabs/cookie.html

关闭它并重新打开它,您将看到相同的点击标签

<强>更新 经过3年的回答,jquery ui已经弃用了cookie选项:http://jqueryui.com/upgrade-guide/1.9/#deprecated-cookie-option

但如果符合您的需求,您仍然可以在此处查看https://stackoverflow.com/a/14313315/109217

答案 2 :(得分:11)

我刚刚实施的一个更简单的替代方案:

$(".tabs").tabs({
    select: function(event, ui) {                   
       window.location.replace(ui.tab.hash);
    },
});

这会将哈希值添加到网址,以便页面刷新重新加载该标签,并使用location.replace而不是location.hash,我们不会用不需要的步骤填充用户的历史记录

希望有所帮助。

答案 3 :(得分:5)

现在,在jQuery UI 1.10.0中,cookie已经消失,我将Gayathiri的方法与新的选项和事件混合在一起:

// using cookie plugin from https://github.com/carhartl/jquery-cookie

var tabCookieName = "ui-tabs-1";
$(".tabs").tabs({
    active : ($.cookie(tabCookieName) || 0);
    activate : function( event, ui ) {
        var newIndex = ui.newTab.parent().children().index(ui.newTab);
        // my setup requires the custom path, yours may not
        $.cookie(tabCookieName, newIndex, { path: window.location.pathname });
    }
});

答案 4 :(得分:4)

使用localStorage执行此操作的简短,与布局无关的方式:

$("#tabs").tabs({
  active: localStorage.getItem("currentIdx"),
  activate: function(event, ui) {
      localStorage.setItem("currentIdx", $(this).tabs('option', 'active'));
  }
});

使用自定义数据属性进行特定于布局的方式(如果要在脚本的其他位置以某种方式使用属性值,则可能很有用)。

jQuery UI:

$("#tabs").tabs({
    active: localStorage.getItem("currentTabIndex"),
    activate: function(event, ui) {
        localStorage.setItem("currentTabIndex", ui.newPanel[0].dataset["tabIndex"]);
    }
});

示例HTML布局:

<div id="tabs">
    <div id="tabs-1" data-tab-index="0">
       tab 1 stuff...
    </div>
    <div id="tabs-2" data-tab-index="1">
       tab 2 stuff...
    </div>    
    <div id="tabs-3" data-tab-index="2">
       tab 3 stuff...
    </div>
</div>

答案 5 :(得分:2)

当网页刷新时,他们会再次请求页面从服务器重新加载状态。

网络服务器需要记住状态并提供与默认文件不同的文件,或者您可以使用cookie或URL的哈希组件和一些jQuery来存储状态,在加载时读取它并恢复它

请参阅jquery.cookie pluginSWFaddress,了解自己操作哈希值或jQuery History插件。

散列方法具有特殊吸引力,因为它复制了URL的更改,因此URL的复制/粘贴仍然有效,书签也是如此。

答案 6 :(得分:1)

包含jquery cookies插件:

<script type="text/javascript" src="/resources/js/jquery.cookies.2.2.0.min.js"></script>

在$ .function({..或document.ready as

)中声明一个cookie名称
var cookieName = "mycookie";

$("#tabs").tabs({
    selected : ($.cookies.get(cookieName) || 0),
    select : function(e, ui) {
        $.cookies.set(cookieName, ui.index);
    }
        });

答案 7 :(得分:1)

你可以尝试这样的事情,这很容易做到。

# Set selected_tab to the correct index based on the current url anchor hash
selected_tab = 0
if matches = /#(\w+)/.exec(window.location.hash)
  # find the index of the tab with the given id
  selected_tab = $('#' + matches[1]).index() - 1

# Initialize the tabs and set 'selected' to equal the selected_tab variable we just set
$('.tabable').tabs
  selected: selected_tab,  # this is where the magic happens
  select: (evt, ui) ->
    window.location.hash = ui.panel.id  # set an anchor tag in the url with the tab id

答案 8 :(得分:1)

另一种选择是使用html 5存储。请参阅此处以获取示例:http://www.w3schools.com/html/html5_webstorage.asp

答案 9 :(得分:1)

这是一种允许通过元素id(而不是索引)记住打开选项卡的替代方法。如果您使用此代码同步具有相似元素的两个不同页面上的打开选项卡(如显示和编辑页面),这将非常有用。

var tabsid = "#tabs";
var cookieid = "tabs_selected2";

var activetabnr = 0;
if (($.cookie(cookieid)!=null) && ($.cookie(cookieid)!="")) {
   activetabnr = $(tabsid+' a[href="'+$.cookie(cookieid)+'"]').parent().index();
}

$(tabsid).tabs({
   active: $(tabsid).tabs({ active: activetabnr }),
   beforeActivate: function (event, ui) {
        $.cookie(cookieid, "#"+ui.newPanel.attr('id'));
   }
});

适用于jQuery UI 1.10。 不要忘记包含jquery.cookie plugin

<script type="text/javascript" src="/js/jquery.cookie.js"></script>

答案 10 :(得分:1)

如果您正在使用引导3或4标签,则可以使用本地存储来存储当前标签ID,然后将其设置为在页面加载时显示。 首先,您将阻止默认方法打开标签页,然后将打开的标签页链接ID保存在标签页打开事件中。

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

对我来说总是很好。

答案 11 :(得分:0)

您认为可以在下面的代码中添加相同的功能。

$(".menu > li").click(function(e){
    $(".content." + $(".menu > .active").attr("id")).fadeOut("fast", function() {
        $(".content." + e.target.id).fadeIn();
        $(".menu > #" + e.target.id).addClass("active");
    });

    $(".menu > .active").removeClass("active");

    return true;

});

答案 12 :(得分:0)

我的公司阻止了Cookie,所以我找到了解决方法。只需使用隐藏字段跟踪选项卡,并在请求完成后将该值传回。它并不漂亮,但它完成了工作。

<% if(request.getAttribute("tab")==null) { %>
    $("#tabs").tabs();
<% } else { %>
    $("#tabs").tabs({selected:<%=request.getAttribute("tab").toString() %>});
<% } %>

在后端我只设置属性

request.setAttribute("tab", f.get("tab").toString());

希望这有帮助。

答案 13 :(得分:0)

   $(function () {

        $("#dialog").dialog({
            autoOpen: false,
            show: {
                effect: "blind",
                duration: 1000
            },
            hide: {
                effect: "explode",
                duration: 1000
            }
        });

        //$(function () {
            $("#tabs").tabs({
                    select: function (event, ui) {                       
                    document.location.href = ui.tab.href;                        
                }
            }).show();

        //});

                    $("#MainContent_button1").click(function (event) {                           
                        event .preventDefault();
                         $("#dialog").dialog("open");                           
                    });
    });

我在ASP.NET中使用它,它对我来说很好。我在第二个标签中也有一个按钮来显示一些对话框,它很有效。

Pooja Dhingra

答案 14 :(得分:0)

您可以使用jQuery History plugin,这里是demo(在演示中加载其他链接并尝试刷新)

答案 15 :(得分:0)

我在blog的帮助下解决了同样的问题。

  

HTML标签

 <ul class="tabs clear-fix">
     <li class=""><a href="#tab=java" id="tab1-tab"><i class=" fa fa-search-plus fa-lg" style="font-size:16px; "></i>JAVA</a><span></span></li>
     <li class=""><a href="#tab=js"  id="tab2-tab"><i class=" fa fa-user fa-lg" style="font-size:16px;"></i>JAVA SCRIPT</a><span></span></li>
     <li><a href="#tab=c"  id="tab3-tab"><i class="fa fa-archive fa-lg" style="font-size:16px;"></i>C</a><span></span></li>
     <li><a href="#tab=c2"  id="tab4-tab"><i class=" fa fa-gift fa-lg" style="font-size:16px;"></i>C++</a><span></span></li>
     <li><a href="#tab=jQ"  id="tab5-tab"><i class=" fa fa-heart fa-lg" style="font-size:16px;"></i>jQuery</a><span></span></li>
    </ul>
  

的Javascript

 var selectedTab =  window.location.href.split("#tab=")[1] ;
    var selectedId = $('a[href$=' + selectedTab+']:first').attr('id');

    if (typeof selectedId === "undefined") {
         $('#tab1-tab').trigger("click");
    }
    else{
        $('#'+selectedId).trigger("click");
    }

对我而言,它很有效,建议表示赞赏。

答案 16 :(得分:0)

我最近遇到了同样的问题,花了很长时间查看JQuery UI Tabs Widget的文档。我最终使用事件activatecreate用于JQuery UI 1.10以及localStorage在页面刷新之前存储当前选项卡。

$( ".selector" ).tabs({                                                 
    activate: function( event, ui) {
        //when tab is activated store it's index in activeTabIndex
            var activeTabIndex = $('.tabs').tabs('option','active');
        //add activeTabIndex to localStorage and set with key of 'currentTab'  
            localStorage.setItem('currentTab', activeTabIndex); 
                        },
        create: function( event, ui ) {
            $(".tabs").tabs({       
        //when tabs are created on page refresh, the active tab is set to index of 'currentTab' 
        //after getItem from localStorage
        active: localStorage.getItem('currentTab')
    });
    }

});