如何在页面刷新后保留/维护<p:panelmenu>的崩溃和扩展状态?</p:panelmenu>

时间:2013-09-18 03:31:27

标签: jsf primefaces jsf-2.2

假设我有以下简单的<p:panelMenu>

<p:panelMenu style="width:200px">
    <p:submenu label="Contents">
        <p:menuitem value="MenuItem1" url="SomeURL" icon="ui-icon-disk" />
        <p:menuitem value="MenuItem2" url="SomeURL" icon="ui-icon-disk" />
        <p:menuitem value="MenuItem3" url="SomeURL" icon="ui-icon-disk" />
    </p:submenu>

    <p:separator />

    <p:submenu label="Users">
        <p:menuitem value="MenuItem1" url="SomeURL" icon="ui-icon-disk" />
        <p:menuitem value="MenuItem2" url="SomeURL" icon="ui-icon-disk" />
        <p:menuitem value="MenuItem3" url="SomeURL" icon="ui-icon-disk" />
    </p:submenu>                
</p:panelMenu>

扩展子菜单后,应保持展开状态,直到在页面刷新后明确折叠为止。

同样,稍后,如果子菜单折叠,则应保持折叠状态,直到重新加载/刷新页面后显式扩展为止。这可能吗?


顺便说一句,默认情况下,以下脚本会展开<p:panelMenu>(所有<p:submenu>)。

$(document).ready(function(){
    $(".ui-panelmenu-content").css("display","block");
    $(".ui-panelmenu-header").addClass("ui-state-active");
    $(".ui-icon-triangle-1-e").removeClass("ui-icon-triangle-1-e").addClass("ui-icon-triangle-1-s");
});

以下脚本展开<p:panelMenu>的第一个子菜单,如果它已折叠。

var isMenuExpanded = jQuery('div.ui-panelmenu-content.ui-widget-content.ui-helper-hidden').is(':visible');

if(!isMenuExpanded)
{
    jQuery('.ui-panelmenu-panel a').first().click();
}

3 个答案:

答案 0 :(得分:1)

使用ids设置每个值项 以及点击响应的类

<p:panelMenu id="menu" style="width:200px">
    <p:submenu id="submenu" label="Contents" styleClass="submenu">
        <p:menuitem id="menu1" value="MenuItem1" url="SomeURL" icon="ui-icon-disk" />
        <p:menuitem id="menu2" value="MenuItem2" url="SomeURL" icon="ui-icon-disk" />
        <p:menuitem id="menu3" value="MenuItem3" url="SomeURL" icon="ui-icon-disk" />
    </p:submenu>
</p:panelMenu>

将localstorage设置为全局变量(索引)

$(document).ready(function(){
    localStorage.param=Number(0);
});

与localstorage javascript的变量会话

var param= Number(localStorage.param);

每个页面刷新,获取localstorage变量会话以更改菜单状态

$(document).ready(function(){
var e1 = document.getElementById("menu_submenu");
if(Boolean(param)==true){
    e1.style.display="block";
    e1.parentNode.getElementsByTagName("h3")[0].className="ui-widget ui-panelmenu-header ui-state-default ui-state-active ui-corner-top";
    e1.parentNode.getElementsByTagName("h3")[0].getElementsByTagName("span")[0].className="ui-icon ui-icon-triangle-1-s";
}
else{
    e1.style.display="none";
    e1.parentNode.getElementsByTagName("h3")[0].className="ui-widget ui-panelmenu-header ui-state-default ui-corner-all";
    e1.parentNode.getElementsByTagName("h3")[0].getElementsByTagName("span")[0].className="ui-icon ui-icon-triangle-1-e";
}

单击事件以设置localstorage变量会话

$(document).on("click", ".submenu", function(e) {
var target = e.target || e.srcElement;
while (target && !target.id) {
    target = target.parentNode;
}
if (!(target.id == 'menu1')){
    var n= Number(param)==Number(0)?Number(1):Number(0);
    param=Number(n);
    localStorage.param=Number(n);
   }
});

答案 1 :(得分:1)

<p:panelMenu stateful="false"></p:panelMenu>

stateful attruibute默认值为true。如果要手动控制折叠/展开状态,则应将其设置为false,然后可以在子菜单元素上使用expanded属性。

答案 2 :(得分:0)

存储面板当前状态(已打开且已关闭)的方法已经很好地涵盖了this earlier Stack Overflow question