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插件Skippr实现焦点图幻灯片特效
Apr 12 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
Mar 25 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 Javascript
浅谈node中的cluster集群
Jun 02 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
js实现圆形显示鼠标单击位置
Feb 11 Javascript
vue项目中使用vue-layer弹框插件的方法
Mar 11 Javascript
JavaScript如何优化逻辑判断代码详解
Jun 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读取30天之内的根据算法排序的代码
2008/04/06 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
orm获取关联表里的属性值
2016/04/17 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
vue中axios封装使用的完整教程
2021/03/03 Vue.js
Flask-Mail用法实例分析
2018/07/21 Python
python视频按帧截取图片工具
2019/07/23 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
高三毕业寄语
2014/04/10 职场文书
毕业评语大全
2014/05/04 职场文书
观看信仰心得体会
2014/09/04 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
大四学生个人总结
2015/02/15 职场文书
高三毕业感言
2015/07/30 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书