【连载】实用小demo连载 5 —— js 无限级菜单 demo
来源:互联网 发布:淘宝背景音乐代码生成 编辑:程序博客网 时间:2024/04/27 19:48
小demo连载系列5
通过ajax请求到一个平铺式的json数据结构,根据其中的id和parentid的关系,组成父菜单和子菜单的关系,
由于菜单可以通过其它途径(后台)动态编辑改变,所以是一个不确定级数的无限级菜单,
这里研究了一下这种菜单的显示方式(select+js)
demo下载地址(所有连载的demo都是免费):
http://download.csdn.net/detail/snow_finland/9084915
注意:此demo由于通过ajax请求了一个php文件,所以需要放在php环境中运行
html+js
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html" charset="utf-8" /><title>无限级菜单demo</title></head><body><div id="J_select_wrap"></div><a href="javascript:;" id="J_get_selected">获取选择项</a><script src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script><script type="text/javascript">$('#J_get_selected').hide();// 用来保存获取到的菜单var select_list = [];// 选择下拉菜单中的选项后,触发重新计算子菜单function select_change(e){var index = $(e).index();$('#J_select_wrap select:gt('+index+')').remove();get_child_option($(e).find('option:selected').val());}// 计算子菜单function get_child_option(num){var inner_option = '';for(var data_i in select_list){if(select_list[data_i].parentid == num){inner_option = inner_option + '<option value="'+select_list[data_i].id+'">'+select_list[data_i].name+'</option>';}}if(inner_option != ''){$('#J_select_wrap').append('<select onchange="select_change(this)">'+inner_option+'</select>');var select_num = $('#J_select_wrap select').length;get_child_option($('#J_select_wrap select').eq(select_num - 1).find('option:selected').val());}}// 获取菜单的json格式$.ajax({url:'list.php',type:'POST',dataType:'json',success:function(data){if(data.code == 1){select_list = data.data;get_child_option(1);$('#J_get_selected').show();}},error:function(){}});// 获取用户当前选择的菜单的id$('#J_get_selected').click(function(){var select_num = $('#J_select_wrap select').length;if(select_num > 0){var selected_id = $('#J_select_wrap select').eq(select_num - 1).find('option:selected').val();alert(selected_id);}else{alert('没有选中的选项');}});</script></body></html>
ajax请求的list.php
<?phpecho '{"code":1,"data":[{"id":1,"name":"root","parentid":0,"order":200},{"id":2,"name":"1","parentid":1,"order":200},{"id":3,"name":"2","parentid":1,"order":400},{"id":4,"name":"3","parentid":1,"order":600},{"id":5,"name":"4","parentid":1,"order":800},{"id":6,"name":"4.1","parentid":5,"order":200},{"id":7,"name":"4.2","parentid":5,"order":200},{"id":8,"name":"4.1.1","parentid":6,"order":200},{"id":9,"name":"4.1.2","parentid":6,"order":200}]}';// echo '{"code":1,"data":[]}';// echo '{"code":1,"data":[{"id":1,"name":"root","parentid":0,"order":200}]}';?>
思路说明:
1、通过ajax请求获取平铺的菜单json格式,保存在全局变量中(由于每次改变下拉菜单中的值都需要重新计算子菜单,所以需要保存下来)
2、由于返回结构中id为1的是根节点,不需要显示,所以根据它的id1开始寻找它的子菜单
3、遍历json格式,将其中parentid和当前节点id相同的(说明有父菜单-子菜单关系)取出,组成需要显示的格式,
如果未找到对应的子菜单,说明到这里结束了;
如果有对应的子菜单,那么获取子菜单的第一个(因为默认select第一个的option是选中的),根据它的id再去寻找子菜单,直到没有子菜单为止
4、当改变菜单的选项时,移除改变的菜单的所有子菜单(比如改变的是第一级子菜单,那么第二级、第三级……都移除,改变的是第二级,那么第二级、第三级……都移除,以此类推……),并且根据当前菜单当前选中的option重新计算子菜单
5、获取当前被选中的选项,由于id是唯一的,所以只要获取最后一级的菜单的id即可
补充说明:
由于考虑兼容性问题,有些地方可以使用:lastchild的地方都没有用,特此说明,如果只需要考虑支持css3的浏览器,那么可以使用:lastchild的方法以减轻代码
- 【连载】实用小demo连载 5 —— js 无限级菜单 demo
- 【连载】实用小demo连载 3 —— js 时间转换 demo
- 【连载】实用小demo连载 4 —— css3+js 大转盘 demo
- 【连载】实用小demo连载 1 —— 页码切换demo
- 【连载】实用小demo连载 2 —— Cookie 记录和获取 demo
- JS相关实用Demo
- JavaScript实用小技巧连载更新
- 无限互联的日子——连载一
- JS 小DEMO
- js 小demo
- js小demo
- Bootstrap 树形菜单小DEMO
- [Sparrow OS 设计文档连载(二)] User Guide - Demo
- 神经网络深入(连载10)一个demo程序
- iOS小demo之无限后台
- Vue.js组件——组件通信小demo
- 实用Demo
- Arduino控制—连载
- Android webview 显示. net:ERR_CACHE_MISS
- 最老程序员创业开发实训7---Cocoa Touch Framework实现Splash屏幕功能
- Hibernate – One-to-Many example (XML Mapping)
- pointer location
- python__模块
- 【连载】实用小demo连载 5 —— js 无限级菜单 demo
- jsp笔记
- JavaScript计算器
- openGL图片占用内存计算
- viewHolder,setTag,getTag,setId,getId的使用
- 按理来'|'说是个特殊字符,为啥split需要转义,用replace不需要转义
- MSSql Server基础学习系列———聚合函数
- count和count_if函数
- java解压缩文件