Js编写的菜单树
只需要提供这种JSON格式就ok了 其他的都可以直接引用这个代码进去
- var testMenu=[
- {
- "name": "一级菜单",
- "submenu": [
- {
- "name": "二级菜单",
- "url": ""
- },
- {
- "name": "二级菜单",
- "url": ""
- }
- ]
- },
- {
- "name": "一级菜单",
- "submenu": [
- {
- "name": "二级菜单",
- "url": ""
- },
- {
- "name": "二级菜单",
- "submenu": [
- {
- "name": "三级菜单",
- "submenu": [
- {
- "name": "四级菜单",
- "url": ""
- }
- ]
- },
- {
- "name": "三级菜单",
- "url": ""
- }
- ]
- },
- {
- "name": "二级菜单",
- "url": ""
- },
- {
- "name": "二级菜单",
- "submenu": [
- {
- "name": "三级菜单",
- "submenu": [
- {
- "name": "四级菜单",
- "url": ""
- },
- {
- "name": "四级菜单",
- "submenu": [
- {
- "name": "五级菜单",
- "url": ""
- },
- {
- "name": "五级菜单",
- "url": ""
- }
- ]
- }
- ]
- },
- {
- "name": "三级菜单",
- "url": ""
- }
- ]
- },
- {
- "name": "二级菜单",
- "url": ""
- }
- ]
- },
- {
- "name": "一级菜单",
- "submenu": [
- {
- "name": "二级菜单",
- "url": ""
- },
- {
- "name": "二级菜单",
- "url": ""
- },
- {
- "name": "二级菜单",
- "url": ""
- }
- ]
- }
- ];
只要这种JSON格式就ok了 且上面的参数名 name submenu url是叫这样的名字就可以了 ,然后直接可以在页面HTML如下:
- <div class="wrap-menu"></div>
CSS代码如下:
- <style type="text/css">
- .wrap-menu { overflow:auto; width:300px; background:#F6F6F6; font:12px/1.5 Tahoma,Arial,sans-serif}
- .wrap-menu ul{ list-style:none; margin:; padding:;}
- .wrap-menu ul li{ text-indent:3em; white-space:nowrap; }
- .wrap-menu ul li h2{ cursor:pointer; height:100%; width:100%; margin:0 0 1px 0; font:12px/31px '宋体'; color:#fff; background:red;}
- .wrap-menu ul li a{ display:block; outline:none; height:25px; line-height:25px; margin:1px 0; color:#1A385C; text-decoration:none;}
- .wrap-menu ul li img{ margin-right:10px; margin-left:-17px; margin-top:9px; width:7px; height:7px; background:url(images/arrow.gif) no-repeat; border:none;}
- .wrap-menu ul li img.unfold{ background-position:0 -9px;}
- .wrap-menu ul li a:hover{ background-color:#ccc; background-image:none;}
- </style>
JS代码如下:
- /**
- * JSON无限折叠菜单
- * @constructor {AccordionMenu}
- * @param {options} 对象
- * @date 2013-12-13
- * @author tugenhua
- * @email 879083421@qq.com
- */
- function AccordionMenu(options) {
- this.config = {
- containerCls : '.wrap-menu', // 外层容器
- menuArrs : '', // JSON传进来的数据
- type : 'click', // 默认为click 也可以mouseover
- renderCallBack : null, // 渲染html结构后回调
- clickItemCallBack : null // 每点击某一项时候回调
- };
- this.cache = {
- };
- this.init(options);
- }
- AccordionMenu.prototype = {
- constructor: AccordionMenu,
- init: function(options){
- this.config = $.extend(this.config,options || {});
- var self = this,
- _config = self.config,
- _cache = self.cache;
- // 渲染html结构
- $(_config.containerCls).each(function(index,item){
- self._renderHTML(item);
- // 处理点击事件
- self._bindEnv(item);
- });
- },
- _renderHTML: function(container){
- var self = this,
- _config = self.config,
- _cache = self.cache;
- var ulhtml = $('<ul></ul>');
- $(_config.menuArrs).each(function(index,item){
- var lihtml = $('<li><h2>'+item.name+'</h2></li>');
- if(item.submenu && item.submenu.length > 0) {
- self._createSubMenu(item.submenu,lihtml);
- }
- $(ulhtml).append(lihtml);
- });
- $(container).append(ulhtml);
- _config.renderCallBack && $.isFunction(_config.renderCallBack) && _config.renderCallBack();
- // 处理层级缩进
- self._levelIndent(ulhtml);
- },
- /**
- * 创建子菜单
- * @param {array} 子菜单
- * @param {lihtml} li项
- */
- _createSubMenu: function(submenu,lihtml){
- var self = this,
- _config = self.config,
- _cache = self.cache;
- var subUl = $('<ul></ul>'),
- callee = arguments.callee,
- subLi;
- $(submenu).each(function(index,item){
- var url = item.url || 'javascript:void(0)';
- subLi = $('<li><a href="'+url+'">'+item.name+'</a></li>');
- if(item.submenu && item.submenu.length > 0) {
- $(subLi).children('a').prepend('<img src="data:images/blank.gif" alt=""/>');
- callee(item.submenu, subLi);
- }
- $(subUl).append(subLi);
- });
- $(lihtml).append(subUl);
- },
- /**
- * 处理层级缩进
- */
- _levelIndent: function(ulList){
- var self = this,
- _config = self.config,
- _cache = self.cache,
- callee = arguments.callee;
- var initTextIndent = 2,
- lev = 1,
- $oUl = $(ulList);
- while($oUl.find('ul').length > 0){
- initTextIndent = parseInt(initTextIndent,10) + 2 + 'em';
- $oUl.children().children('ul').addClass('lev-' + lev)
- .children('li').css('text-indent', initTextIndent);
- $oUl = $oUl.children().children('ul');
- lev++;
- }
- $(ulList).find('ul').hide();
- $(ulList).find('ul:first').show();
- },
- /**
- * 绑定事件
- */
- _bindEnv: function(container) {
- var self = this,
- _config = self.config;
- $('h2,a',container).unbind(_config.type);
- $('h2,a',container).bind(_config.type,function(e){
- if($(this).siblings('ul').length > 0) {
- $(this).siblings('ul').slideToggle('slow').end().children('img').toggleClass('unfold');
- }
- $(this).parent('li').siblings().find('ul').hide()
- .end().find('img.unfold').removeClass('unfold');
- _config.clickItemCallBack && $.isFunction(_config.clickItemCallBack) && _config.clickItemCallBack($(this));
- });
- }
- };
代码初始化方式如下:
- $(function(){
- new AccordionMenu({menuArrs:testMenu});
- });
Js编写的菜单树的更多相关文章
- vue+element-ui实现无限级动态菜单树
使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...
- JS动态级联菜单
JS动态级联菜单是前端常用的一个功能,特此抽时间研究了下,附上代码 <html> <head> <meta charset="utf-8" /> ...
- java实现的可以无限级别添加子节点的菜单树
网上大部分菜单树,都是单独用js代码来实现的,这样做的缺点是:用户无法动态的设置菜单项,比如,超级管理员可能需要根据每个用户的权限,赋予他们不同的系统功能,不同的功能对应着不同数量的菜单项. 对于此问 ...
- 3.Node.js 自定义微信菜单
文章目录: 1.Node.js 接入微信公众平台开发 2.Node.js access_token的获取.存储及更新 3.Node.js 自定义微信菜单 ...
- bootstrap treeview实现菜单树
本博客,介绍通过Bootstrap的treeview插件实现菜单树的功能. treeview链接:http://www.htmleaf.com/Demo/201502141380.html ORM框架 ...
- zTree插件实现菜单树
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- 蓝桥杯Web:【功能实现】菜单树检索
[功能实现]菜单树检索 背景介绍 实际工作中很多前端攻城狮都会遇到这样一个需求:在多级菜单树中模糊搜索匹配的菜单项,并显示出来. 本题需要在已提供的基础项目中使用 Vue.js 知识,实现对已提供的二 ...
- 为Node.js编写组件的几种方式
本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...
- Breach - HTML5 时代,基于 JS 编写的浏览器
Breach 是一款属于 HTML5 时代的开源浏览器项目,,完全用 Javascript 编写的.免费.模块化.易于扩展.这个浏览器中的一切都是模块,Web 应用程序在其自己的进程运行.通过选择合适 ...
随机推荐
- JS-只能输入中文和英文
<span style="font-family:KaiTi_GB2312;">转自:<a target=_blank href="http://www ...
- oracle 12C SYS,SYSTEM用户的密码都忘记或是丢失
密码 conn / as sysdba alter user system identified by Abcd1234; manual script first -->manual_scrip ...
- 将ByteArrayOutputStream类型变量中的数据存储到文件中
代码: File zipFile=new File("c:\\1.zip");ByteArrayOutputStream byteOSZip = new ByteArrayOutp ...
- Windows网页上碰到无法完全显示的图片怎么办
如图所示,下一幅图片只能显示一半. 我们选中并在新标签中打开 一般即可正常显示,如果还不行,留意地址栏,这就是这个图片的真实地址,我们完全可以用迅雷直接把这幅图片下载下来. 我们甚至可以猜测,去掉后缀 ...
- 使用theHarvester 进行邮箱和子域名的收集
下载地址:https://github.com/laramies/theHarvester 先要安装python的 reqeusts 库 安装pip install reqeustsmail -d b ...
- close_wait状态的产生原因及解决(转)
最近测试环境server由于需要与大量的后台server交互,今天突然发现有大量的close_wait产生,于是仔细研究了一下: 如果我们的服务器程序处于CLOSE_WAIT状态的话,说明套接字是被动 ...
- ACM-百度之星资格赛之Labyrinth——hdu4826
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- BZOJ 4216 Pig 分块乱搞
题意:id=4216">链接 方法:分块以节约空间. 解析: 这题坑的地方就是他仅仅有3M的内存限制,假设我们开longlong前缀和是必死的. 所以考虑缩小这个long long数组 ...
- Linux终端:speedtest_cli检测你的实时带宽速度
你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web ...
- Android下 调用原生相机拍照摄像
1 http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 2 http://www.cnblogs.com/vir56k/ ...