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 相关文章推荐
学习YUI.Ext 第三天
Mar 10 Javascript
javascript 常用关键字列表集合
Dec 04 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
JS正则替换掉小括号及内容的方法
Nov 29 Javascript
flag和jq on 的绑定多个对象和方法(必看)
Feb 27 Javascript
vue-cli脚手架-bulid下的配置文件
Mar 27 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
Oct 07 Javascript
浅谈JS中this在各个场景下的指向
Aug 14 Javascript
JS删除对象中某一属性案例详解
Sep 08 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危险函数(disable_functions)
2012/02/23 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python3.5安装python3-tk详解
2019/04/26 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
Python super()方法原理详解
2020/03/31 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
有兼职工作经历的简历自我评价
2014/03/07 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
个园导游词
2015/02/04 职场文书
项目建议书
2015/02/04 职场文书
党员转正介绍人意见
2015/06/03 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers