一、引入资源
下载并引入ztree的相关js,css和img等。http://www.treejs.cn/v3/api.php

ztree的核心代码jquery.ztree.core.js
ztree关于选中的代码jquery.ztree.excheck.js(如果有复选框引入)
ztree关于是否可编辑的代码jquery.exedit.js(允许修改节点时引入)

二、初始化ztree
1、页面中创建tree需要显示的载体dom
2、设置ztree的基本配置参数 setting

 1 // zTree 的参数配置,深入使用请参考 API 文档(setting 配置详解)
 2     var setting = {
 3         //是否允许编辑节点
 4         edit: {
 5             enable: true,
 6             editNameSelectAll: true,
 7             showRemoveBtn: true,
 8             removeTitle: "删除节点",
 9             showRenameBtn: true,
10             renameTitle: "编辑节点"
11         },
12         data: {
13             simpleData: {
14                 enable: true
15             }
16         },
17         callback: {
18             beforeRemove: beforeRemove,  //移除前
19             beforeRename: beforeRename,   //重命名前
20             //onRemove: onRemove,
21             onRename: onRename,
22             beforeDrag:beforeDrag,
23             onClick: zTreeOnClick //注册节点的点击事件
24         },
25         view: {
26             selectedMulti: false,
27             addHoverDom: addHoverDom, //移入节点显示编辑按钮
28             removeHoverDom: removeHoverDom  //移入节点显示编辑按钮
29         },
30     };

3、获取节点初始数据,并初始化ztree
ztree支持的数据结构,可查看官网文档。

 1  //获取部门tree数据
 2     function loadTree() {
 3         $.ajax({
 4             type: 'POST',
 5             contentType: '',
 6             url: "",
 7             data: {},
 8             timeout: 1000, //超时时间设置,单位毫秒
 9             dataType: 'json',
10             success: function (res) {
11                 zNodes = []; //初始化ztree
12                 for (var i = 0; i < res.length; i++) {
13                     var data = res[i]
14                     zNodes.push({
15                         'id': data.id,
16                         'pId': data.pId,
17                         'name': data.name,
18                         'open': false
19                     });
20                 }
21                 zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes); //初始化ztree
22             }
23         })
24 
25     }
26 
27     $(document).ready(function () {
28         loadTree()
29     });

三、配置增删改方法

添加:

在节点下添加新节点信息
1、首先在setting的callback中,设置addHoverDom方法,鼠标移入节点时,显示编辑按钮;在setting的edit中也需要设置显示编辑按钮。
2、

 1 //鼠标移入节点,显示编辑按钮
 2     function addHoverDom(treeId, treeNode) {  //treeNode是当前hover的节点信息
 3         var sObj = $("#" + treeNode.tId + "_span");
 4         if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;
 5         var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
 6             + "' title='添加节点' οnfοcus='this.blur();'></span>";
 7         sObj.after(addStr);
 8         var btn = $("#addBtn_" + treeNode.tId);
 9 
10         //判断该部门下是否有人员,用于删除节点时,当节点下有信息,禁止删除。
11         var data1 = {
12             "id": treeNode.id,
13             "pageNumber": currentPageNumber,
14             "pageSize": currentPageSize
15         };
16         $.ajax({
17             type: 'POST',
18             url: "",
19             data: data1,
20             timeout: 1000, //超时时间设置,单位毫秒
21             dataType: 'json',
22             success: function (res) {
23                 //console.log(res);
24                 if(res.flag == 0){
25                     var datalist = res.data.list;
26                     if(datalist.length==0){
27                         hasMember = false;
28                     }else{
29                         hasMember = true;
30                     }
31                 }
32 
33             }
34         });
35         //当点击添加按钮时:
36         if (btn) btn.bind("click", function () {
37             var zTree = $.fn.zTree.getZTreeObj("treeDemo");
38             console.log(treeNode.id);
39             var name = "新部门" + (newCount++);
40             var newNode;
41             //发送请求保存一个新建的节点,后台返回ID,用返回的ID新增节点
42             var data = {
43                 "code": treeNode.id,
44                 "name": name
45             };
46             $.ajax({
47                 type: 'post',
48                 url: "",
49                 data: data,
50                 timeout: 1000, //超时时间设置,单位毫秒
51                 dataType: 'json',
52                 success: function (res) {
53                     console.log(res)
54                     if (res.flag == 0 ) {
55                         var newId = res.data;
56                         //在树节点上增加节点
57                         newNode = zTree.addNodes(treeNode, {id: newId, pId: treeNode.id, name: name});
58                         zTree.editName(newNode[0]) //新增的节点进入编辑状态
59                     }
60                 }
61             });
62             return false;
63         });
64     }

添加新的根节点
流程与上述方法类似,只是在树节点之外增加一个新增根节点按钮,并添加上对应的方法

 1 //添加根节点
 2     $('.addnode').click(function () {
 3         var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
 4             nodes = zTree.getNodes();
 5             console.log(nodes)
 6             
 7         var name = "新部门" + (newCount++);
 8         var newNode;
 9         //发送请求保存一个新建的节点,根据返回ID添加新节点
10         var data = {
11             "code": 0,
12             "name": name
13         };
14         $.ajax({
15             type: 'post',
16             url: "",
17             data: data,
18             timeout: 1000, //超时时间设置,单位毫秒
19             dataType: 'json',
20             success: function (res) {
21                 console.log(res)
22                 if (res.flag == 0) {
23                     var newId = res.data;
24                     newNode = zTree.addNodes(null, {id: newId, pId: null, name: name});
25                     zTree.editName(newNode[0]);  //新增后显示编辑状态
26                 }
27             }
28         });
29     });

修改

重命名修改
1、重命名之前的判空,在beforeRename函数中判断

 1 //重命名之前的判断
 2     function beforeRename(treeId, treeNode, newName) {
 3         if (newName.length == 0) {
 4             layer.msg("节点名称不能为空.");
 5             var zTree = $.fn.zTree.getZTreeObj("treeDemo");
 6             setTimeout(function () {
 7                 zTree.editName(treeNode)
 8             }, 10);
 9             return false;
10         }
11         return true;
12     }

2、重命名的前后台交互

 1 //修改节点信息
 2     function onRename(event, treeId, treeNode, isCancel) {
 3         if (isCancel) {
 4             return;
 5         }
 6         var zTree = $.fn.zTree.getZTreeObj("treeDemo");
 7         var onodes = zTree.getNodes()
 8         console.log(onodes);
 9         //发送请求修改节点信息
10         var data = {
11             "id": treeNode.id,
12             "code": treeNode.pId,  //父节点
13             "name": treeNode.name,
14         };
15         $.ajax({
16             type: 'post',
17             url: "",
18             data: data,
19             timeout: 1000, //超时时间设置,单位毫秒
20             dataType: 'json',
21             success: function (res) {
22                     layer.msg(res.msg)
23             }
24         });
25     }

删除

需求:
删除前需要二次确认;
当节点下有子节点时,禁止删除改节点;
当节点下有对应的其他信息时,禁止删除;

 1 //删除之前的判断
 2     function beforeRemove(treeId, treeNode) {
 3         var data = {
 4             "id": treeNode.id
 5         };
 6         className = (className === "dark" ? "" : "dark");
 7 
 8         if(treeNode.isParent){
 9             layer.alert('该节点下有子节点,不能删除');
10             return false;
11         }
12 
13         if(hasMember){
14             layer.alert('该部门下有人员,不能删除');
15             return false;
16         }
17         var oFlag = confirm("确认删除 节点 -- " + treeNode.name + " 吗?");
18         if(oFlag){
19             $.ajax({
20                 type: 'post',
21                 url: "",
22                 data: data,
23                 timeout: 1000, //超时时间设置,单位毫秒
24                 dataType: 'json',
25                 success: function (res) {
26                     console.log(res)
27                     if (res.flag == 0) {
28                         layer.msg(res.msg)
29                         return true;
30                     }else {
31                         layer.msg(res.msg);
32                         return false;
33                     }
34                 }
35             })
36         }else{
37             return false
38         }
39     }

其他

鼠标移出时,隐藏编辑按钮

1 function removeHoverDom(treeId, treeNode) {
2         $("#addBtn_" + treeNode.tId).unbind().remove();
3     };

禁止节点之前的拖拽

1 function beforeDrag(){
2         return false;  //禁止所有拖拽功能
3     }

点击节点的事件

1 //当点击节点
2     function zTreeOnClick(event, treeId, treeNode) {
3         //alert(treeNode.tId + ", " + treeNode.name);
4         //这里根据节点ID获取对应信息或进行对应的操作  
5     }