简要介绍:

之前手头的一个项目需要去做一个左侧的树形菜单,右侧则是一个整体的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优化设置指南
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
如何在VPS电脑上快速搭建网站?
专业公司网站制作公司,用什么语言做企业网站比较好?
中山网站制作网页,中山新生登记系统登记流程?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
招商网站制作流程,网站招商广告语?
清除minerd进程的简单方法
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
建站之星如何实现网站加密操作?
如何在云虚拟主机上快速搭建个人网站?
,柠檬视频怎样兑换vip?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何快速搭建二级域名独立网站?
建站之星代理费用多少?最新价格详情介绍
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
江苏网站制作公司有哪些,江苏书法考级官方网站?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
建站之星各版本价格是多少?
建站之星后台管理如何实现高效配置?
制作证书网站有哪些,全国城建培训中心证书查询官网?
宝塔Windows建站如何避免显示默认IIS页面?
如何彻底卸载建站之星软件?
建站主机功能解析:服务器选择与快速搭建指南
制作门户网站的参考文献在哪,小说网站怎么建立?
,sp开头的版面叫什么?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星如何实现五合一智能建站与营销推广?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
建站主机选购指南与交易推荐:核心配置解析
如何在云服务器上快速搭建个人网站?
如何挑选优质建站一级代理提升网站排名?
家庭建站与云服务器建站,如何选择更优?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
利用JavaScript实现拖拽改变元素大小
建站之星备案是否影响网站上线时间?
太平洋网站制作公司,网络用语太平洋是什么意思?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
*请认真填写需求信息,我们会在24小时内与您取得联系。