最近因项目的需要,实现树形结构展示中国的各个省市区,数据是从数据库中加载而来,在网上找了很多树形结构的插件,比如easyui,dynatree,ztree等等,他们的实现方式是大同小异。最后选择了ztree。
zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点(官网上的描述)。
引入js和css
jquery.ztree.core-3.5.js
jquery.js
zTreeStyle.css 树形结构的样式
官网地址:http://www.ztree.me/v3/main.php#_zTreeInfo
个人感觉ztree最大的特点就是提供了延迟加载技术,比如对于节点比较多的话,页面加载的过程中会出现缓慢的情况,ztree针对这一问题做了优化。
具体的实现:
页面接受json数据分为简单的json数据和标准的json数据
简单的json数据数据:
{id:1, pId:0, name: "父节点1"},{id:11, pId:1, name: "子节点1"},{id:12, pId:1, name: "子节点2"}
标准的json数据格式:
{name: "父节点1", children: [
{name: "子节点1"},
{name: "子节点2"}
]}
我们可以看到标准的json数据是典型的树形父子关系;
这里可以根据数据库中表的数据存储方式来决定采用哪种json数据格式。
页面的实现方式:
1.设置setting
var setting = {
data: {
simpleData: {
enable: true
}
}
};
2.节点,简单的json数据
var zNodes =[
{ id:1, pId:0, name:"父节点1 - 展开"},
{ id:11, pId:1, name:"父节点11 - 折叠"},
{ id:111, pId:11, name:"叶子节点111"},
{ id:112, pId:11, name:"叶子节点112"},
{ id:113, pId:11, name:"叶子节点113"},
{ id:114, pId:11, name:"叶子节点114"},
{ id:12, pId:1, name:"父节点12 - 折叠"},
{ id:121, pId:12, name:"叶子节点121"},
{ id:122, pId:12, name:"叶子节点122"},
{ id:123, pId:12, name:"叶子节点123"},
{ id:124, pId:12, name:"叶子节点124"},
{ id:13, pId:1, name:"父节点13 - 没有子节点"},
{ id:2, pId:0, name:"父节点2 - 折叠"},
{ id:21, pId:2, name:"父节点21 - 展开"},
{ id:211, pId:21, name:"叶子节点211"},
{ id:212, pId:21, name:"叶子节点212"},
{ id:213, pId:21, name:"叶子节点213"},
{ id:214, pId:21, name:"叶子节点214"},
{ id:22, pId:2, name:"父节点22 - 折叠"},
{ id:221, pId:22, name:"叶子节点221"},
{ id:222, pId:22, name:"叶子节点222"},
{ id:223, pId:22, name:"叶子节点223"},
{ id:224, pId:22, name:"叶子节点224"},
{ id:23, pId:2, name:"父节点23 - 折叠"},
{ id:231, pId:23, name:"叶子节点231"},
{ id:232, pId:23, name:"叶子节点232"},
{ id:233, pId:23, name:"叶子节点233"},
{ id:234, pId:23, name:"叶子节点234"},
{ id:3, pId:0, name:"父节点3 - 没有子节点"}
];
3.进入页面的时候加载该项
$(document).ready(function(){
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
以上是最简单的ztree的实现方式。
从后台通过ajax读取json数据:
var zNodes;
$(document).ready(function(){
$.ajax({
async : false,
cache:false,
type: 'POST',
dataType : 'json',
url: '<%=basePath%>ajax/treeInfo',//请求的action路径
error: function () {//请求失败处理函数
alert('请求失败');
},
success:function(data){ //请求成功后处理函数。
zNodes = data; //把后台封装好的简单Json格式赋给treeNodes
}
});
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
相比上面的获取节点数据信息,这里是通过ajax实现的,得到的data是json格式;
在页面中明明一个id为treeDemo的即可。
有的时候我们实现了tree之后需要treenode中的点击时间,查下API后发现setting中有onclick时间,这里我们写一个函数,实现onclick的时候回调:
如下
function zTreeOnClick(event, treeId, treeNode) {
$("#echoActive").text("节点名称:"+treeNode.name+"----"+"节点的id值:"+treeNode.id);
};
在setting中实现回调,如下
callback: { onClick: zTreeOnClick },
在点击treenode的时候会自动将数据text填充到id为echoActive的div中。