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 相关文章推荐
怎样在JavaScript里写一个swing把数据插入数据库
Dec 10 Javascript
js confirm()方法的使用方法实例
Jul 13 Javascript
js中return false(阻止)的用法
Aug 14 Javascript
jquery 延迟执行实例介绍
Aug 20 Javascript
javascript查询字符串参数的方法
Jan 28 Javascript
浅谈下拉菜单中的Option对象
May 10 Javascript
jQuery实现背景弹性滚动的导航效果
Jun 01 Javascript
解析AngularJS中get请求URL出现的跨域问题
Dec 01 Javascript
wap手机端解决返回上一页的js实例
Dec 08 Javascript
JavaScript程序设计高级算法之动态规划实例分析
Nov 24 Javascript
JavaScript私有变量实例详解
Jan 24 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
Mar 26 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
javascript操作JSON的要领总结
2012/12/09 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
socket + select 完成伪并发操作的实例
2017/08/15 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
结构工程个人自荐信范文
2013/11/30 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
如何写好闭幕词
2019/04/02 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技