Js USES cookie to refresh the unchanged tree menu

  • 2020-03-30 04:12:36
  • OfStack

Set the cookie to save the state of the tree menu, and re-read the cookie to set the menu when the page loads.

Menu HTML structure:


<div class="treemenu">
<ul>
<li>
<a href="#" id="treemenu_a_1"> Menu one </a>
<div class="submenu" id="submenu_1">
<ul>
<li><a href="subpage/a.html" id="submenu_a_1_1"> Second level menu 1 </a></li>
<li><a href="subpage/b.html" id="submenu_a_1_2"> Menu 2, level 2 </a></li>
<li><a href="#" id="submenu_a_1_3"> Second level menu three </a></li>
<li><a href="#" id="submenu_a_1_4"> Menu two four </a></li>
<li><a href="#" id="submenu_a_1_5"> Menu 5, level 2 </a></li>
</ul>
</div>
</li>
<li>
<a href="#" id="treemenu_a_2"> Menu 1 2 </a>
<div class="submenu" id="submenu_2">
<ul>
<li>
<a href="#" id="submenu_a_2_1"> Second level menu 1 </a>
<div class="submenu" id="submenu_2_1">
<ul>
<li><a href="#" id="submenu_a_2_1_1"> Level 3 menu 1 </a></li>
<li><a href="#" id="submenu_a_2_1_2"> Menu three 2 </a></li>
<li>
<a href="#" id="submenu_a_2_1_3"> Menu three </a>
<div class="submenu" id="submenu_2_1_3">
<ul>
<li><a href="#" id="submenu_a_2_1_3_1"> Level 4 menu 1 </a></li>
<li><a href="#" id="submenu_a_2_1_3_2"> Level 4 menu 2 </a></li>
<li><a href="#" id="submenu_a_2_1_3_3"> Level 4 menu 3 </a></li>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li><a href="#" id="submenu_a_2_2"> Menu 2, level 2 </a></li>
<li><a href="#" id="submenu_a_2_3"> Second level menu three </a></li>
<li><a href="#" id="submenu_a_2_4"> Menu two four </a></li>
<li><a href="#" id="submenu_a_2_5"> Menu 5, level 2 </a></li>
</ul>
</div>
</li>
<li>
<a href="#" id="treemenu_a_3"> Menu 1 3 </a>
<div class="submenu" id="submenu_3">
<ul>
<li><a href="#" id="submenu_a_3_1"> Second level menu 1 </a></li>
<li><a href="#" id="submenu_a_3_2"> Menu 2, level 2 </a></li>
<li><a href="#" id="submenu_a_3_3"> Second level menu three </a></li>
<li><a href="#" id="submenu_a_3_4"> Menu two four </a></li>
<li><a href="#" id="submenu_a_3_5"> Menu 5, level 2 </a></li>
</ul>
</div>
</li>
</ul>
</div>

Read cookie tool class:


//Cookie tools
var cookieTool = {
//Read the cookie
getCookie: function(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) {
c_end = document.cookie.length;
}
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
},
//Set the cookie
setCookie: function(c_name, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays); //Set the date
document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
},
//Delete the cookie
delCookie: function(c_name) {
var exdate = new Date();
exdate.setDate(exdate.getDate() - 1); //Yesterday date
document.cookie = c_name + "=;expires=" + exdate.toGMTString();
}
};

Menu event binding:


//Menu event binding
$('.treemenu a').bind('click', function() {
var $this = $(this);
var id = $this.attr('id');
var $submenu = $this.next('.submenu');
if ($submenu.length > 0) { //Whether there is a submenu
var flag = $(this).next('.submenu:hidden').length > 0 ? true : false;
if (flag) {
$submenu.show();
} else {
$submenu.hide();
}
var display = flag ? 'block' : 'none';
cookieTool.setCookie(id, display, 10);
} else {
cookieTool.setCookie(id, id, 10);
var curId = cookieTool.getCookie(id);
$('.treemenu').find('.on').removeClass('on').addClass('off');
$('#' + curId).addClass('on');
$('.treemenu a[class="off"]').each(function() { 
cookieTool.delCookie($(this).attr('id')); //Delete other selected option cookies
});
}
});

Reset the menu when the page loads


//Page load reads cookies
$('.treemenu a').each(function() {
showMenu($(this).attr('id'));
});

//Read the cookie display menu
function showMenu(id) {
var $this = $('#' + id);
var cookie = cookieTool.getCookie(id);
if (cookie) {
if ($this.next('.submenu').length > 0) {
$this.next('.submenu').css('display', cookie);
} else {
$('#' + cookie).addClass('on');
}
}
}

Complete the DEMO:

(link: http://xiazai.jb51.net/201410/yuanma/jsflusmnav.zip)

Note: cookies cannot be read from the chrome local console and need to be tested in a firefox/IE or server environment


Related articles: