layui 无限级多级菜单

layui 二级菜单 :https://gitee.com/hslr/layui_extension_modulemenu
我更改了下,变成了无线级菜单
layui.define('element',function(exports){
var $ = layui.$,element = layui.element,tamp=new Date().getTime();
var elem='#enian_menu_'+tamp;
var menu_Ul = '<div class="layui-side layui-bg-black"><div class="layui-side-scroll" ><ul class="layui-nav layui-nav-tree" lay-shrink="" id="enian_menu_'+ tamp +'" lay-filter="enian_menu_'+ tamp +'"></ul></div></div>';
var enian_menu = {
render: render,
setCheck:setCheck,
v:"1.0.2019-1-9"
};
/*
* 渲染纵向菜单
* 1.对象数据
* 2.DOM名称 jq类型 #id .class
* 3.单击回调
*/
function render(data,domName,r){
var htmlUl = '';
var root = [];
$(domName).html(menu_Ul);
//遍历分组
for(var k in data){
//判断是不是分组
if(data[k].pid==0 || data[k].pid=='group'){
$(elem).append(group(data[k]));
root.push(data[k]);
}
}
for (var k in root) {
endlessUl(root[k], data,20);
}
////遍历二级菜单
//for(var k in data){
// var sonHtml='<dd data-name="console">'+ html_url(data[k]) +'</dd>';
// $(elem+' dl[data-id_'+tamp+'= "'+ data[k].pid +'" ]').append(sonHtml)
//}
element.init()
if(r){
//监听菜单被单击
element.on('nav(enian_menu_'+tamp+')', function(elem){
if(elem.attr('data-url')){
obj = {'type':elem.attr('data-type'),'url':elem.attr('data-url'),'id':elem.attr('data-id'),'name':elem.html(),'title':elem.attr('data-title')}
r(obj)
}
});
}
}
/*
* 解析分组代码
*/
function group(obj){
var html=''
var children='<dl class="layui-nav-child sonmenus" data-id_'+tamp+'="'+obj.id+'" ></dl>'
if(obj.url){
//无二级菜单可点击...
html = html_group_url(obj);
return '<li data-name="home" class="layui-nav-item">'+html+'</li>';
}else{
html = html_group(obj);
//有二级菜单...
if(obj.open && obj.open == true){
return '<li class="layui-nav-item layui-nav-itemed">'+html+children+'</li>';
}else{
return '<li class="layui-nav-item">'+html+children+'</li>';
}
}
}
/*
* HTML源码,url链接,a标签
*/
function html_url(obj){
var checked = (obj.checked==true)?'data-check_'+tamp+'="true"':'';
obj.id = obj.id?obj.id:'';
obj.title = obj.title?obj.title:'';
obj.type = obj.type?obj.type:'';
obj.url = obj.url?obj.url:'';
obj.name = obj.name?obj.name:'';
obj.note = obj.note?obj.note:'';
var html ;
if(obj.img){
html = '<a class="enian_menu_'+ tamp +'" style="margin-left:23px" title="'+ obj.note +'" '+checked+' data-name="'+ obj.name +'" data-id="'+ obj.id +'" data-title="'+ obj.title +'" data-type="'+ obj.type +'" data-url="'+ obj.url +'">'+obj.img+'<cite style="margin-left:8px">'+obj.title+'</cite></a>';
}else{
html = '<a class="enian_menu_'+ tamp +'" style="margin-left:23px" title="'+ obj.note +'" '+checked+' data-name="'+ obj.name +'" data-id="'+ obj.id +'" data-title="'+ obj.title +'" data-type="'+ obj.type +'" data-url="'+ obj.url +'">'+obj.title+'</a>';
}
return html;
}
function html_url_len(obj,len) {
var checked = (obj.checked == true) ? 'data-check_' + tamp + '="true"' : '';
obj.id = obj.id ? obj.id : '';
obj.title = obj.title ? obj.title : '';
obj.type = obj.type ? obj.type : '';
obj.url = obj.url ? obj.url : '';
obj.name = obj.name ? obj.name : '';
obj.note = obj.note ? obj.note : '';
var html;
if (obj.img) {
html = '<a class="enian_menu_' + tamp + '" style="margin-left:' + len+'px" title="' + obj.note + '" ' + checked + ' data-name="' + obj.name + '" data-id="' + obj.id + '" data-title="' + obj.title + '" data-type="' + obj.type + '" data-url="' + obj.url + '">' + obj.img + '<cite style="margin-left:8px">' + obj.title + '</cite></a>';
} else {
html = '<a class="enian_menu_' + tamp + '" style="margin-left:'+len+'px" title="' + obj.note + '" ' + checked + ' data-name="' + obj.name + '" data-id="' + obj.id + '" data-title="' + obj.title + '" data-type="' + obj.type + '" data-url="' + obj.url + '">' + obj.title + '</a>';
}
return html;
}
function endlessUl(obj, initData,spaceLen) {
var checked = (obj.checked == true) ? 'data-check_' + tamp + '="true"' : '';
obj.id = obj.id ? obj.id : '';
obj.title = obj.title ? obj.title : '';
obj.type = obj.type ? obj.type : '';
obj.url = obj.url ? obj.url : '';
obj.name = obj.name ? obj.name : '';
obj.note = obj.note ? obj.note : '';
var html;
var childNode = [];
for (var i = 0; i < initData.length; i++) {
if (obj.id == initData[i].pid) {
childNode.push(initData[i]);
}
}
if (childNode.length > 0) {
var sonHtml = '<dd data-name="console">' + html_url_len(obj, spaceLen) +
'<dl class="layui-nav-child sonmenus" data-id_' + tamp + '="' + obj.id + '" ></dl>'+
'</dd>';
$(elem + ' dl[data-id_' + tamp + '= "' + obj.pid + '" ]').append(sonHtml)
for (var m = 0; m < childNode.length; m++) {
endlessUl(childNode[m], initData, spaceLen+5)
}
} else {
var sonHtml = '<dd data-name="console" data-id_' + tamp + '= "' + obj.id + '">' + html_url_len(obj, spaceLen) + '</dd>';
$(elem + ' dl[data-id_' + tamp + '= "' + obj.pid + '" ]').append(sonHtml)
}
}
/*
* HTML源码,普通分组
*/
function html_group(obj){
var note = obj.note || '';
if(obj.img){
html = '<a title="'+ note +'">'+obj.img+'<cite style="margin-left:8px">'+obj.title+'</cite></a>';
}else{
html = '<a title="'+ note +'">'+obj.title+'</a>';
}
return html;
}
/*
* HTML源码,可点击分组
*/
function html_group_url(obj){
var checked = (obj.checked==true)?'data-check_'+tamp+'="true"':'';
obj.id = obj.id?obj.id:'';
obj.title = obj.title?obj.title:'';
obj.type = obj.type?obj.type:'';
obj.url = obj.url?obj.url:'';
obj.name = obj.name?obj.name:'';
obj.note = obj.note?obj.note:'';
var html ;
if(obj.img){
//href="javascript:;"
html = '<a class="enian_menu_'+ tamp +'" title="'+ obj.note +'" data-name="'+ obj.name +'" data-id="'+ obj.id +'" '+checked+' data-title="'+ obj.title +'" data-type="'+ obj.type +'" data-url="'+ obj.url +'">'+obj.img+'<cite style="margin-left:8px">'+obj.title+'</cite></a>';
}else{
html = '<a class="enian_menu_'+ tamp +'" title="'+ obj.note +'" data-name="'+ obj.name +'" data-id="'+ obj.id +'" '+checked+' data-title="'+ obj.title +'" data-type="'+ obj.type +'" data-url="'+ obj.url +'">'+obj.title+'</a>';
}
return html;
}
/* setCheck
* 设置选中项目
* 参数1.要寻找的字段 可选:id type name title url
* 参数2.被寻找的内容
*/
function setCheck(key,content){
var cElem = $(elem+' a[data-'+key+' = "'+ content +'" ]');
//当没有查找到符合条件的,不进行刷新选中 特性,用于子页跳转其他无菜单链接,2018-12-10 12:04:32
if(cElem.length>0){
$(elem+' .layui-this').removeClass('layui-this');//删除已经选中
cElem.parent().addClass('layui-this');//选中指定
cElem.parent().parent().parent().addClass('layui-nav-itemed')//打开分组
}else{
return false;
}
}
//输出test接口
exports('enianMenu', enian_menu);
});
// 模块手册:http://enianteam.com/doc/layui_module/43.html
function endlessUl(obj, initData,spaceLen) {
var childNode = [];
for (var i = 0; i < initData.length; i++) {
if (obj.id == initData[i].pid) {
childNode.push(initData[i]);
}
}
if (childNode.length > 0) {
var sonHtml = '<dd data-name="console">' + html_url_len(obj, spaceLen) +
'<dl class="layui-nav-child sonmenus" data-id_' + tamp + '="' + obj.id + '" ></dl>'+
'</dd>';
$(elem + ' dl[data-id_' + tamp + '= "' + obj.pid + '" ]').append(sonHtml)
for (var m = 0; m < childNode.length; m++) {
endlessUl(childNode[m], initData, spaceLen+5)
}
} else {
var sonHtml = '<dd data-name="console" data-id_' + tamp + '= "' + obj.id + '">' + html_url_len(obj, spaceLen) + '</dd>';
$(elem + ' dl[data-id_' + tamp + '= "' + obj.pid + '" ]').append(sonHtml)
}
}
layui 无限级多级菜单的更多相关文章
- Vue2 实现树形菜单(多级菜单)功能模块
结构示意图 ├── index.html ├── main.js ├── router │ └── index.js # 路由配置文件 ├── components # 组件目录 │ ├── App. ...
- vue+element-ui实现无限级动态菜单树
使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...
- 前端开发css实战:使用css制作网页中的多级菜单
前端开发css实战:使用css制作网页中的多级菜单 在日常工作中,大家都会遇到一些显示隐藏类菜单,比如页头导航.二维码显示隐藏.文本提示等等......而这些效果都是可以使用纯css实现的(而且非常简 ...
- MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...
- java 24 - 7 GUI之 创建多级菜单窗体
需求: 创建多级菜单 步骤: A:创建窗体对象(并设置属性和布局) B:创建菜单栏 C:创建菜单和子菜单 D:逐步添加菜单(子菜单添加到菜单中,菜单添加到菜单栏中) E:窗体中设置菜单栏(菜单栏并不是 ...
- 单片机C语言下LCD多级菜单的一种实现方法
摘要: 介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑.实用的程序模型. 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD 中 ...
- zTree下拉菜单多级菜单多选实现
惯例,先上图: 这是在一个项目中,为了满足样式美观.多级菜单以及多选而将zTree插件更改过后的效果. 在实际的开发过程中,本来zTree也是可以满足需求的,但是zTree多选的话需要checkbox ...
- Jquery多级菜单插件Slimmenu使用说明
Jquery多级菜单插件Slimmenu使用说明 现在扁平化设计逐渐的成为了趋势,不管是pc web,还是移动互联网的应用开发,都在研究和设计Flat ui, 这里有一篇文章说明扁平化的设计的一些想法 ...
- python作业设计:多级菜单,并可依次进入各级子菜单
'''作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 ''' data = { "北京":{ "昌平":{ "沙河&qu ...
- Python练习----多级菜单
多级菜单要求: 1.三级菜单 2.可依次选择进入各子菜单 3.可以返回上一层 4.输入'q'可以退出 脚本: zone = { '北京' : { ' ...
随机推荐
- RPM打包教程
一.rpm是什么 rpm是一种安装包的格式.就像在Windows系统上我们常见的安装包格式是exe和msi一样,在linux上常见的安装包格式是deb和rpm.一般在红帽系列的系统上,不支持deb,所 ...
- HuffmanTree,哈夫曼树的原理和c++实现
目录 一.什么是哈夫曼树 二.构造哈夫曼树 三.路径.编码.解码 四.代码 一.什么是哈夫曼树 哈夫曼树又称为最优树. 通过权值来构造树,权值越大,离根节点越近 经常用于无损压缩算法 用于需要优化存储 ...
- 2、androidStudio调用Unity方法
1.导入Unity的Classes.jar文件 (1).首先找到这个包在哪 Unity版本为5.0之前时,classes.jar的路径: unity的安装路径\Editor\Data\Playback ...
- 双端队列的基本实现【数据结构与算法—TypeScript 实现】
笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程 特性 本质:允许队列在两端进行 入队 和 出队 操作 设计 实现方式:基于 数组 实现 属性: data:存放队列元素 ...
- 给你安利一款鲁班大叔开发的maven依赖搜索神器
写在前面 一款好的插件往往能提高我们的开发效率.今天就给大家安利一款maven 依赖搜索插件. 插件是自己一直关注的鲁班大叔开发的,用了几天真的好用 废话不多说,我们就来看看这是一款什么插件 一.ma ...
- python websocket 参数
websocket中就有建立连接connect.发送消息send等函数可供使用,但是websocket.WebSocketApp将这些都封装好了,只用在实例化的时候传入自定义函数即可,更方便.因此这里 ...
- 力扣442(java)-数组中重复的数据(中等)
题目: 给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 .请你找出所有出现 两次 的整数,并以数组形式返回. 你必须设 ...
- [FAQ] VsCode 同时多行编辑
[多光标自定义编辑] 按住 alt 键,鼠标左键点击,出现多个光标. [批量选中匹配编辑] 鼠标选中字符,按快捷键 ctrl + shift + L,字符的右侧都出现光标,可同时编辑. Tool: ...
- dotnet 根据基线包版本实现库版本兼容
本文来告诉大家如何根据 基线包版本 的功能来实现自动在构建过程中,告诉开发者,当前版本是否存在不兼容旧版本的变更.其不兼容变更包括二进制中断变更和 API 不兼容变更和源代码中断变更.可以让库开发者花 ...
- PostMan测试图片上传接口的方法
一.选择POST后添加接口地址 二.选择Body下的from-data 注:Headers不要加参数 三.填写key,再key后的下拉选择file,然后选择文件 注:key并不是图片名称,而是接口接收 ...