问题
Suppose I have the following simple <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>
Once a sub menu is expanded should remain expanded until it is explicitly collapsed even after a page refresh.
Similarly, sometime later, if the sub menu is collapsed should remain collapsed until it is explicitly expanded even after the page reloaded/refreshed. Is this possible?
By the way, the following script expands a <p:panelMenu>
by default (all <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");
});
And the following script expands the first sub menu of <p:panelMenu>
, if it is collapsed.
var isMenuExpanded = jQuery('div.ui-panelmenu-content.ui-widget-content.ui-helper-hidden').is(':visible');
if(!isMenuExpanded)
{
jQuery('.ui-panelmenu-panel a').first().click();
}
回答1:
Set every value item with ids and also with class to the click response
<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>
set localstorage as global variable (index)
$(document).ready(function(){
localStorage.param=Number(0);
});
variables session with localstorage javascript
var param= Number(localStorage.param);
every page refresh, get the localstorage variable session to change the menu state
$(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";
}
the click event to set the localstorage variable session
$(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);
}
});
回答2:
<p:panelMenu stateful="false"></p:panelMenu>
stateful
attruibute default is true
. If you want to control collapsed/expanded states by hand, you should set it false
, then you can use expanded
attribute on submenu elements.
回答3:
Ways to store the current state of your panels (which are open and which are closed) are already covered pretty nicely with this earlier Stack Overflow question.
来源:https://stackoverflow.com/questions/18863381/how-to-retain-maintain-collapse-and-expand-states-of-ppanelmenu-even-after-a