简要介绍:

之前手头的一个项目需要去做一个左侧的树形菜单,右侧则是一个整体的iframe,从而构成一个整体的网站。一开始是打算用bootstrap的tree-view插件,直接把菜单的数据传过去就好了,结果后来项目又改了需求,菜单的内容和图表都是后台动态生成的,所以只能放弃使用bootstrap插件,自己着手写了一个树形菜单。本文主要分两部分讲,一个是对于bootstrap的treeview的实践,另一部分是介绍自己写的树形菜单。
bootstrap-treeview:
组件介绍:https://www./article/96222.htm
其实关于该组件在其他网站上已经讲得很详细了,我就不再赘述了,但是网上的应用还是有点问题,这里主要讲一下自己使用这个插件过程吧。
1. html引用及结构
引用css:文件本身的css文件、bootstrp.css文件
引用js:jquery、bootstrap-treeview.js、引用该组件的treeview.js文件
整体HTML结构主要分为了三个部分:头部、树状栏部分、iframe部分,使用组件的为树状栏部分:#tree
2.引用组件js设置:
具体设置代码如下:主要思路是用data传入菜单的数据和依靠关系,同时可以设置一些变量来控制改树状栏的样式和基本功能,如代码40-43行,具体变量对应的数值的意义可以参见之前链接中的表格
(function(win) {
var data = [
{
text: "Parent 1",
nodes: [
{
text: "Child 1",
nodes: [
{
text: "Grandchild 1"
},
{
text: "Grandchild 2"
}
]
},
{
text: "Child 2"
}
]
},
{
text: "Parent 2"
},
{
text: "Parent 3"
},
{
text: "Parent 4"
},
{
text: "Parent 5"
}
];
var tree = function() {
$('#tree').treeview({
data: data,
backColor: '#293541',
color: 'white',
onhoverColor:'#202a33;',
showBorder: false
});
}
var init = function() {
tree();
}
init();
})(window)
设置完成之后树状栏的样式如下图所示,另外细节方面可以通过阅读相应参数来设置,值得一提的是树状栏的icon图标是通过bootstrap的glyphicon设置的,有兴趣的童鞋可以去看一下这个东西,来为菜单设置不同的icon,不过实际效果感觉不是特别好。这也是我决定自己去搞一个树状栏的原因。
自定义树状菜单:
treeview的插件只能点击菜单前面的加号icon展开关闭,样式的变化有限,而且我们需要根据后台传入的数据来动态设置菜单的结构和内容,所以为了满足这几个需求,重新写了一个tree.js
js主要分成三个部分,第一个部分是为每个菜单和子菜单注册点击事件以及通过后台传来的数据为其绑定跳转链接;第二个部分是通过ajax获取后台传来的菜单数据,并将数据传入前台;第三个部分是通过underscore的template函数将前台页面进行渲染,达到动态实现树状栏的功能。、
相关js代码:
var tree = function() {
//一级导航点击事件
$('.nodeBox').on('click', function(event) {
var _this = $(this);
var child = _this.parent().find('.nodechild_box');
if (_this.attr('opened') == 'opened') {
_this.parent().find('.childnode').hide();
child.hide();
_this.attr('opened', '');
}else{
_this.parent().find('.childnode').show();
child.show();
_this.attr('opened', 'opened');
};
});
//二级导航点击事件
$('.nodechild_box').on('click', function(event) {
var _this = $(this);
var child = _this.parent().find('.gchild_box');
if (_this.attr('opened') == 'opened') {
child.hide();
_this.parent().find('.gchildnode').hide();
_this.find('.add').attr('src', 'images/icon_add.png');
_this.attr('opened', '');
}else{
child.show();
_this.parent().find('.gchildnode').show();
_this.find('.add').attr('src', 'images/icon_minus.png');
_this.attr('opened', 'opened');
};
});
//三级导航点击事件
$('.gchild_box').on('click', function(event) {
var _this = $(this);
var child = _this.parent().find('.ggchild_box');
if (_this.attr('opened') == 'opened') {
child.hide();
_this.find('.add').attr('src', 'images/icon_add.png');
_this.attr('opened', '');
}else{
child.show();
_this.find('.add').attr('src', 'images/icon_minus.png');
_this.attr('opened', 'opened');
};
});
//hover显示箭头及背景变化
$('.nodeBox').mouseover(function(event) {
$(this).addClass('tree_hover');
$(this).find('.arrow').show();
});
$('.nodeBox').mouseout(function(event) {
$(this).removeClass('tree_hover');
$(this).find('.arrow').hide();
});
$('.nodechild_box').mouseover(function(event) {
$(this).addClass('box_hover');
$(this).find('.arrow').show();
});
$('.nodechild_box').mouseout(function(event) {
$(this).removeClass('box_hover');
$(this).find('.arrow').hide();
});
$('.gchild_box').mouseover(function(event) {
$(this).addClass('box_hover');
$(this).find('.arrow').show();
});
$('.gchild_box').mouseout(function(event) {
$(this).removeClass('box_hover');
$(this).find('.arrow').hide();
});
$('.ggchild_box').mouseover(function(event) {
$(this).addClass('box_hover');
$(this).find('.arrow').show();
});
$('.ggchild_box').mouseout(function(event) {
$(this).removeClass('box_hover');
$(this).find('.arrow').hide();
});
};
//链接函数
var tree_link = function() {
var linkBox = $('[menurl]');
linkBox.each(function(i, ele) {
var _ele = $(ele);
var key = _ele.attr('menurl');
if(key != '/'){
$(this).on('click',function(){
$('#mainweb').attr('src', key);
auto();
})
}
});
};
//获取登陆用户数据
var getData = function() {
var cond = sessionStorage.cond;
$.post("XXXX", {}, function(json) {
console.log(json)
if(json.code == 200){
data = json.data;
fillUserName(data);
fillTree(data);
var length = $('.nodeBox').length ;
for (var i = 0;i < length;i++) {
var iconId = data.icons[i].iconId;
$('.nodeBox').eq(i+1).attr('menuid',i);
$('.nodeBox').eq(i+1).find('img').attr('src','images/'+ data.icons[iconId-1].name +'');
}
//为每个菜单添加链接
tree_link()
}
}, function(xhr) {
console.log(xhr)
});
}
var fillTree = function(data){
var tmplDom = $('#tree');
tmplDom.parent().html(eking.template.getHtml(tmplDom.html(),data));
tree();
}
HTML渲染:
<div class="main w_1200">
<div class="tree">
<script type="text/html" id="tree">
<div class="tree_box">
<div class="nodeBox index" menurl="notice.html">
<span class="m_l_10"><img src="images/icon_home.png" alt=""></span>
<span class="m_l_10">首页</span>
<span class="arrow fr m_r_10"><img src="images/icon_arrow.png" alt=""></span>
</div>
</div>
<%var menus = data.menus;%>
<%for(var i = 0;i < menus.length;i++){%>
<div class="tree_box">
<div class="nodeBox" menurl=<%=menus[i].url%> >
<span class="m_l_10"><img src="" alt=""></span>
<span class="m_l_10"><%=menus[i].name%></span>
</div>
<%var childmenus = menus[i].childs;%>
<%for(var j = 0;j < childmenus.length;j++){%>
<div class="childnode">
<div class="nodechild_box" menurl=<%=childmenus[j].url%> >
<%if(childmenus[j].childs.length != 0){%>
<span class="m_l_20"><img class="add" src="images/icon_add.png" alt=""></span>
<span class="m_l_10"><%=childmenus[j].name%></span>
<%}else{%>
<span class="m_l_55"><%=childmenus[j].name%></span>
<span class="arrow fr m_r_10"><img src="images/icon_arrow.png" alt=""></span>
<%}%>
</div>
<%var cchildmenus = childmenus[j].childs;%>
<%for(var k = 0;k < cchildmenus.length;k++){%>
<div class="gchildnode">
<div class="gchild_box" menurl=<%=cchildmenus[k].url%> >
<%if(cchildmenus[k].childs.length != 0){%>
<span class="m_l_30"><img class="add" src="images/icon_add.png" alt=""></span>
<span class="m_l_10"><%=cchildmenus[k].name%></span>
<%}else{%>
<span class="m_l_65"><%=cchildmenus[k].name%></span>
<span class="arrow fr m_r_10"><img src="images/icon_arrow.png" alt=""></span>
<%}%>
</div>
<%var ccchildmenus = cchildmenus[k].childs;%>
<%for(var l = 0;l < ccchildmenus.length;l++){%>
<div class="ggchild_box" menurl=<%=ccchildmenus[l].url%> >
<span class="m_l_70"><%=ccchildmenus[l].name%></span>
<span class="arrow fr m_r_10"><img src="images/icon_arrow.png" alt=""></span>
</div>
<%}%>
</div>
<%}%>
</div>
<%}%>
</div>
<%}%>
</script>
</div>
后台传入的数据格式为
菜单效果如图:
存在的不足和问题:
为了跟上项目进度,tree.js尚未组件化,等有时间了打算把这一块封装为一个js组件,通过设置参数完成树状栏的设置。
P.S.由于个人技术水平有限,难免出现错误,请多多指正 :)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Bootstrap
# treeview
# bootstrap树控件
# Bootstrap树形菜单
# TreeView.js树形菜单
# Android TreeView实现带复选框树形组织结构
# 对Python 窗体(tkinter)树状数据(Treeview)详解
# bootstrap treeview 树形菜单带复选框及级联选择功能
# WPF自定义TreeView控件样式实现QQ联系人列表效果
# Bootstrap treeview实现动态加载数据并添加快捷搜索功能
# Android UI 之实现多级树形列表TreeView示例
# Bootstrap树形菜单插件TreeView.js使用方法详解
# 浅析BootStrap Treeview的简单使用
# GTK treeview原理及使用方法解析
# 树状
# 写了
# 的是
# 都是
# 我就
# 这一
# 第一个
# 则是
# 可以通过
# 去看
# 得很
# 第二个
# 去做
# 并将
# 有兴趣
# 自定义
# 为其
# 如图
# 所示
# 跳转
相关文章:
如何快速搭建个人网站并优化SEO?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
海南网站制作公司有哪些,海口网是哪家的?
PHP正则匹配日期和时间(时间戳转换)的实例代码
高端建站三要素:定制模板、企业官网与响应式设计优化
MySQL查询结果复制到新表的方法(更新、插入)
建站之星后台密码遗忘或太弱?如何重置与强化?
太原网站制作公司有哪些,网约车营运证查询官网?
如何在阿里云完成域名注册与建站?
SQL查询语句优化的实用方法总结
javascript中对象的定义、使用以及对象和原型链操作小结
怎么将XML数据可视化 D3.js加载XML
如何快速搭建高效简练网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
三星网站视频制作教程下载,三星w23网页如何全屏?
微课制作网站有哪些,微课网怎么进?
如何通过网站建站时间优化SEO与用户体验?
平台云上自主建站:模板化设计与智能工具打造高效网站
建站之星如何配置系统实现高效建站?
深圳网站制作案例,网页的相关名词有哪些?
活动邀请函制作网站有哪些,活动邀请函文案?
如何在香港服务器上快速搭建免备案网站?
建站之星代理如何获取技术支持?
网站代码制作软件有哪些,如何生成自己网站的代码?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
安徽网站建设与外贸建站服务专业定制方案
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
制作表格网站有哪些,线上表格怎么弄?
nginx修改上传文件大小限制的方法
历史网站制作软件,华为如何找回被删除的网站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何通过西部数码建站助手快速创建专业网站?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
建站之星在线客服如何快速接入解答?
如何通过VPS建站无需域名直接访问?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何通过虚拟机搭建网站?详细步骤解析
h5在线制作网站电脑版下载,h5网页制作软件?
javascript中的try catch异常捕获机制用法分析
Android自定义listview布局实现上拉加载下拉刷新功能
寿县云建站:智能SEO优化与多行业模板快速上线指南
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
Bpmn 2.0的XML文件怎么画流程图
建站之星安装路径如何正确选择及配置?
为什么Go需要go mod文件_Go go mod文件作用说明
,在苏州找工作,上哪个网站比较好?
*请认真填写需求信息,我们会在24小时内与您取得联系。