js 通过cookie实现刷新不变化树形菜单


Posted in Javascript onOctober 30, 2014

通过设置cookie来保存树形菜单的状态,在页面加载时重新读取cookie来设置菜单。

菜单的HTML结构:

<div class="treemenu">
<ul>
<li>
<a href="#" id="treemenu_a_1">一级菜单一</a>
<div class="submenu" id="submenu_1">
<ul>
<li><a href="subpage/a.html" id="submenu_a_1_1">二级菜单一</a></li>
<li><a href="subpage/b.html" id="submenu_a_1_2">二级菜单二</a></li>
<li><a href="#" id="submenu_a_1_3">二级菜单三</a></li>
<li><a href="#" id="submenu_a_1_4">二级菜单四</a></li>
<li><a href="#" id="submenu_a_1_5">二级菜单五</a></li>
</ul>
</div>
</li>
<li>
<a href="#" id="treemenu_a_2">一级菜单二</a>
<div class="submenu" id="submenu_2">
<ul>
<li>
<a href="#" id="submenu_a_2_1">二级菜单一</a>
<div class="submenu" id="submenu_2_1">
<ul>
<li><a href="#" id="submenu_a_2_1_1">三级菜单一</a></li>
<li><a href="#" id="submenu_a_2_1_2">三级菜单二</a></li>
<li>
<a href="#" id="submenu_a_2_1_3">三级菜单三</a>
<div class="submenu" id="submenu_2_1_3">
<ul>
<li><a href="#" id="submenu_a_2_1_3_1">四级菜单一</a></li>
<li><a href="#" id="submenu_a_2_1_3_2">四级菜单二</a></li>
<li><a href="#" id="submenu_a_2_1_3_3">四级菜单三</a></li>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li><a href="#" id="submenu_a_2_2">二级菜单二</a></li>
<li><a href="#" id="submenu_a_2_3">二级菜单三</a></li>
<li><a href="#" id="submenu_a_2_4">二级菜单四</a></li>
<li><a href="#" id="submenu_a_2_5">二级菜单五</a></li>
</ul>
</div>
</li>
<li>
<a href="#" id="treemenu_a_3">一级菜单三</a>
<div class="submenu" id="submenu_3">
<ul>
<li><a href="#" id="submenu_a_3_1">二级菜单一</a></li>
<li><a href="#" id="submenu_a_3_2">二级菜单二</a></li>
<li><a href="#" id="submenu_a_3_3">二级菜单三</a></li>
<li><a href="#" id="submenu_a_3_4">二级菜单四</a></li>
<li><a href="#" id="submenu_a_3_5">二级菜单五</a></li>
</ul>
</div>
</li>
</ul>
</div>

读取cookie工具类:

//cookie工具类
var cookieTool = {
//读取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 "";
},
//设置cookie
setCookie: function(c_name, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays); //设置日期
document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
},
//删除cookie
delCookie: function(c_name) {
var exdate = new Date();
exdate.setDate(exdate.getDate() - 1); //昨天日期
document.cookie = c_name + "=;expires=" + exdate.toGMTString();
}
};

菜单事件绑定:

//菜单事件绑定
$('.treemenu a').bind('click', function() {
var $this = $(this);
var id = $this.attr('id');
var $submenu = $this.next('.submenu');
if ($submenu.length > 0) { //是否有子菜单
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')); //删除其他已选择选项cookie
});
}
});

页面加载时重新设置菜单

//页面加载读取cookies
$('.treemenu a').each(function() {
showMenu($(this).attr('id'));
});

//读取cookie显示菜单
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');
}
}
}

完整DEMO:

注意:chrome本地控制台无法读取cookie,需要在firefox/IE或者服务器环境下测试

Javascript 相关文章推荐
仿迅雷焦点广告效果(JQuery版)
Nov 19 Javascript
Extjs入门之动态加载树代码
Apr 09 Javascript
Bootstrap开关(switch)控件学习笔记分享
May 30 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
js学习总结之dom2级事件基础知识详解
Jul 27 Javascript
使用electron制作满屏心特效的示例代码
Nov 27 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 #Javascript
javascript根据时间生成m位随机数最大13位
Oct 30 #Javascript
D3.js 从P元素的创建开始(显示可加载数据)
Oct 30 #Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
Oct 30 #Javascript
如何调试异步加载页面里包含的js文件
Oct 30 #Javascript
fckeditor粘贴Word时弹出窗口取消的方法
Oct 30 #Javascript
js中style.display=&quot;&quot;无效的解决方法
Oct 30 #Javascript
You might like
基于php冒泡排序算法的深入理解
2013/06/09 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
php实现记事本案例
2020/10/20 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
JavaScript中的类继承
2010/11/25 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
Django内容增加富文本功能的实例
2017/10/17 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
详解python tcp编程
2020/08/24 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
员工培训心得体会
2013/12/30 职场文书
社区平安建设方案
2014/05/25 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js