只需要提供这种JSON格式就ok了 其他的都可以直接引用这个代码进去

  1. var testMenu=[
  2. {
  3. "name": "一级菜单",
  4. "submenu": [
  5. {
  6. "name": "二级菜单",
  7. "url": ""
  8. },
  9. {
  10. "name": "二级菜单",
  11. "url": ""
  12. }
  13. ]
  14. },
  15. {
  16. "name": "一级菜单",
  17. "submenu": [
  18. {
  19. "name": "二级菜单",
  20. "url": ""
  21. },
  22. {
  23. "name": "二级菜单",
  24. "submenu": [
  25. {
  26. "name": "三级菜单",
  27. "submenu": [
  28. {
  29. "name": "四级菜单",
  30. "url": ""
  31. }
  32. ]
  33. },
  34. {
  35. "name": "三级菜单",
  36. "url": ""
  37. }
  38. ]
  39. },
  40. {
  41. "name": "二级菜单",
  42. "url": ""
  43. },
  44. {
  45. "name": "二级菜单",
  46. "submenu": [
  47. {
  48. "name": "三级菜单",
  49. "submenu": [
  50. {
  51. "name": "四级菜单",
  52. "url": ""
  53. },
  54. {
  55. "name": "四级菜单",
  56. "submenu": [
  57. {
  58. "name": "五级菜单",
  59. "url": ""
  60. },
  61. {
  62. "name": "五级菜单",
  63. "url": ""
  64. }
  65. ]
  66. }
  67. ]
  68. },
  69. {
  70. "name": "三级菜单",
  71. "url": ""
  72. }
  73. ]
  74. },
  75. {
  76. "name": "二级菜单",
  77. "url": ""
  78. }
  79. ]
  80. },
  81. {
  82. "name": "一级菜单",
  83. "submenu": [
  84. {
  85. "name": "二级菜单",
  86. "url": ""
  87. },
  88. {
  89. "name": "二级菜单",
  90. "url": ""
  91. },
  92. {
  93. "name": "二级菜单",
  94. "url": ""
  95. }
  96. ]
  97. }
  98. ];

只要这种JSON格式就ok了 且上面的参数名 name submenu url是叫这样的名字就可以了 ,然后直接可以在页面HTML如下:

  1. <div class="wrap-menu"></div>

CSS代码如下:

  1. <style type="text/css">
  2. .wrap-menu { overflow:auto; width:300px; background:#F6F6F6; font:12px/1.5 Tahoma,Arial,sans-serif}
  3. .wrap-menu ul{ list-style:none; margin:; padding:;}
  4. .wrap-menu ul li{ text-indent:3em; white-space:nowrap; }
  5. .wrap-menu ul li h2{ cursor:pointer; height:100%; width:100%; margin:0 0 1px 0; font:12px/31px '宋体'; color:#fff; background:red;}
  6. .wrap-menu ul li a{ display:block; outline:none; height:25px; line-height:25px; margin:1px 0; color:#1A385C; text-decoration:none;}
  7. .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;}
  8. .wrap-menu ul li img.unfold{ background-position:0 -9px;}
  9. .wrap-menu ul li a:hover{ background-color:#ccc; background-image:none;}
  10. </style>

JS代码如下:

  1. /**
  2. * JSON无限折叠菜单
  3. * @constructor {AccordionMenu}
  4. * @param {options} 对象
  5. * @date 2013-12-13
  6. * @author tugenhua
  7. * @email 879083421@qq.com
  8. */
  9.  
  10. function AccordionMenu(options) {
  11. this.config = {
  12. containerCls : '.wrap-menu', // 外层容器
  13. menuArrs : '', // JSON传进来的数据
  14. type : 'click', // 默认为click 也可以mouseover
  15. renderCallBack : null, // 渲染html结构后回调
  16. clickItemCallBack : null // 每点击某一项时候回调
  17. };
  18. this.cache = {
  19.  
  20. };
  21. this.init(options);
  22. }
  23.  
  24. AccordionMenu.prototype = {
  25.  
  26. constructor: AccordionMenu,
  27.  
  28. init: function(options){
  29. this.config = $.extend(this.config,options || {});
  30. var self = this,
  31. _config = self.config,
  32. _cache = self.cache;
  33.  
  34. // 渲染html结构
  35. $(_config.containerCls).each(function(index,item){
  36.  
  37. self._renderHTML(item);
  38.  
  39. // 处理点击事件
  40. self._bindEnv(item);
  41. });
  42. },
  43. _renderHTML: function(container){
  44. var self = this,
  45. _config = self.config,
  46. _cache = self.cache;
  47. var ulhtml = $('<ul></ul>');
  48. $(_config.menuArrs).each(function(index,item){
  49. var lihtml = $('<li><h2>'+item.name+'</h2></li>');
  50.  
  51. if(item.submenu && item.submenu.length > 0) {
  52. self._createSubMenu(item.submenu,lihtml);
  53. }
  54. $(ulhtml).append(lihtml);
  55. });
  56. $(container).append(ulhtml);
  57.  
  58. _config.renderCallBack && $.isFunction(_config.renderCallBack) && _config.renderCallBack();
  59.  
  60. // 处理层级缩进
  61. self._levelIndent(ulhtml);
  62. },
  63. /**
  64. * 创建子菜单
  65. * @param {array} 子菜单
  66. * @param {lihtml} li项
  67. */
  68. _createSubMenu: function(submenu,lihtml){
  69. var self = this,
  70. _config = self.config,
  71. _cache = self.cache;
  72. var subUl = $('<ul></ul>'),
  73. callee = arguments.callee,
  74. subLi;
  75.  
  76. $(submenu).each(function(index,item){
  77. var url = item.url || 'javascript:void(0)';
  78.  
  79. subLi = $('<li><a href="'+url+'">'+item.name+'</a></li>');
  80. if(item.submenu && item.submenu.length > 0) {
  81.  
  82. $(subLi).children('a').prepend('<img src="data:images/blank.gif" alt=""/>');
  83. callee(item.submenu, subLi);
  84. }
  85. $(subUl).append(subLi);
  86. });
  87. $(lihtml).append(subUl);
  88. },
  89. /**
  90. * 处理层级缩进
  91. */
  92. _levelIndent: function(ulList){
  93. var self = this,
  94. _config = self.config,
  95. _cache = self.cache,
  96. callee = arguments.callee;
  97.  
  98. var initTextIndent = 2,
  99. lev = 1,
  100. $oUl = $(ulList);
  101.  
  102. while($oUl.find('ul').length > 0){
  103. initTextIndent = parseInt(initTextIndent,10) + 2 + 'em';
  104. $oUl.children().children('ul').addClass('lev-' + lev)
  105. .children('li').css('text-indent', initTextIndent);
  106. $oUl = $oUl.children().children('ul');
  107. lev++;
  108. }
  109. $(ulList).find('ul').hide();
  110. $(ulList).find('ul:first').show();
  111. },
  112. /**
  113. * 绑定事件
  114. */
  115. _bindEnv: function(container) {
  116. var self = this,
  117. _config = self.config;
  118.  
  119. $('h2,a',container).unbind(_config.type);
  120. $('h2,a',container).bind(_config.type,function(e){
  121. if($(this).siblings('ul').length > 0) {
  122. $(this).siblings('ul').slideToggle('slow').end().children('img').toggleClass('unfold');
  123. }
  124.  
  125. $(this).parent('li').siblings().find('ul').hide()
  126. .end().find('img.unfold').removeClass('unfold');
  127. _config.clickItemCallBack && $.isFunction(_config.clickItemCallBack) && _config.clickItemCallBack($(this));
  128.  
  129. });
  130. }
  131. };

代码初始化方式如下:

  1. $(function(){
  2. new AccordionMenu({menuArrs:testMenu});
  3. });

Js编写的菜单树的更多相关文章

  1. vue+element-ui实现无限级动态菜单树

    使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...

  2. JS动态级联菜单

    JS动态级联菜单是前端常用的一个功能,特此抽时间研究了下,附上代码 <html> <head> <meta charset="utf-8" /> ...

  3. java实现的可以无限级别添加子节点的菜单树

    网上大部分菜单树,都是单独用js代码来实现的,这样做的缺点是:用户无法动态的设置菜单项,比如,超级管理员可能需要根据每个用户的权限,赋予他们不同的系统功能,不同的功能对应着不同数量的菜单项. 对于此问 ...

  4. 3.Node.js 自定义微信菜单

    文章目录:         1.Node.js 接入微信公众平台开发         2.Node.js access_token的获取.存储及更新         3.Node.js 自定义微信菜单 ...

  5. bootstrap treeview实现菜单树

    本博客,介绍通过Bootstrap的treeview插件实现菜单树的功能. treeview链接:http://www.htmleaf.com/Demo/201502141380.html ORM框架 ...

  6. zTree插件实现菜单树

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...

  7. 蓝桥杯Web:【功能实现】菜单树检索

    [功能实现]菜单树检索 背景介绍 实际工作中很多前端攻城狮都会遇到这样一个需求:在多级菜单树中模糊搜索匹配的菜单项,并显示出来. 本题需要在已提供的基础项目中使用 Vue.js 知识,实现对已提供的二 ...

  8. 为Node.js编写组件的几种方式

    本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...

  9. Breach - HTML5 时代,基于 JS 编写的浏览器

    Breach 是一款属于 HTML5 时代的开源浏览器项目,,完全用 Javascript 编写的.免费.模块化.易于扩展.这个浏览器中的一切都是模块,Web 应用程序在其自己的进程运行.通过选择合适 ...

随机推荐

  1. JS-只能输入中文和英文

    <span style="font-family:KaiTi_GB2312;">转自:<a target=_blank href="http://www ...

  2. oracle 12C SYS,SYSTEM用户的密码都忘记或是丢失

    密码 conn / as sysdba alter user system identified by Abcd1234; manual script first -->manual_scrip ...

  3. 将ByteArrayOutputStream类型变量中的数据存储到文件中

    代码: File zipFile=new File("c:\\1.zip");ByteArrayOutputStream byteOSZip = new ByteArrayOutp ...

  4. Windows网页上碰到无法完全显示的图片怎么办

    如图所示,下一幅图片只能显示一半. 我们选中并在新标签中打开 一般即可正常显示,如果还不行,留意地址栏,这就是这个图片的真实地址,我们完全可以用迅雷直接把这幅图片下载下来. 我们甚至可以猜测,去掉后缀 ...

  5. 使用theHarvester 进行邮箱和子域名的收集

    下载地址:https://github.com/laramies/theHarvester 先要安装python的 reqeusts 库 安装pip install reqeustsmail -d b ...

  6. close_wait状态的产生原因及解决(转)

    最近测试环境server由于需要与大量的后台server交互,今天突然发现有大量的close_wait产生,于是仔细研究了一下: 如果我们的服务器程序处于CLOSE_WAIT状态的话,说明套接字是被动 ...

  7. ACM-百度之星资格赛之Labyrinth——hdu4826

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. BZOJ 4216 Pig 分块乱搞

    题意:id=4216">链接 方法:分块以节约空间. 解析: 这题坑的地方就是他仅仅有3M的内存限制,假设我们开longlong前缀和是必死的. 所以考虑缩小这个long long数组 ...

  9. Linux终端:speedtest_cli检测你的实时带宽速度

    你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web ...

  10. Android下 调用原生相机拍照摄像

    1 http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 2 http://www.cnblogs.com/vir56k/ ...