树结构数据的展示和编辑-zTree树插件的简单使用
最近在项目当中遇到一个需求,需要以树结构的方式展示一些数据,并可对每一个树节点做内容的编辑以及树节点的添加和删除,刚好听说有zTree这个插件可以实现这样的需求,所以在项目的这个需求完成之后,在博客里用一个小demo的形式记录一下zTree的简单实用方法。
1、下载zTree插件
zTree的官网地址是:http://www.treejs.cn/v3/main.php#_zTreeInfo
下载地址是:https://gitee.com/zTree/zTree_v3
2、引入相应的css和js文件
zTreeStyle.css
jquery.min.js
jquery.ztree.core.min.js
jquery.ztree.excheck.min.js
jquery.ztree.exedit.min.js
3、不说废话,直接代码,简洁明了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>zTree的简单实用</title>
<link rel="stylesheet" href="zTreeStyle.css">
<script src="jquery.min.js"></script>
<script src="jquery.ztree.core-3.5.min.js"></script>
<script src="jquery.ztree.excheck-3.5.min.js"></script>
<script src="jquery.ztree.exedit-3.5.min.js"></script>
<style>
.ztree li {line-height: 25px;}
.ztree li span.button.switch {height: 20px;margin-top: -7px;}
.ztree li span.button.ico_open,
.ztree li span.button.ico_close {background-image: none; width: 0px;margin-left: -2px;}
.ztree li span.button.ico_docu {background-image: none; width: 0px;}
.ztree li a {height: 25px;}
.ztree li span {font-size: 14px;font-family: "PingFang SC", "Hiragino GB", "Microsoft YaHei", "Helvetica Neue", "Helvetica", "ARIAL"}
.ztree li a.curSelectedNode {height: 18px;}
.ztree li a.curSelectedNode_Edit{height: 18px;}
.ztree li a.curSelectedNode_Edit span {display: inline-block;height: 18px;}
.ztree li a.curSelectedNode_Edit input {display: inline-block;height: 18px;font-size: 14px;width: 100%;min-width: 150px;font-family: "PingFang SC", "Hiragino GB", "Microsoft YaHei", "Helvetica Neue", "Helvetica", "ARIAL"}
.ztree li a.curSelectedNode {max-width: 260px;overflow: hidden;}
.ztree li span {max-width: 185px;display: inline-block;overflow: hidden;}
.ztree li span input{width: 150px;}
.ztree li span.button.add {margin-left: 2px;background-position: -144px 0;vertical-align: top;background-image: url(imgs/jui.png);background-position-x: -278px;background-position-y: -237px;}
.ztree li span.button.edit {margin-left: 3px;background-position: -144px 0;vertical-align: top;background-image: url(imgs/jui.png);background-position-x: 2px;background-position-y: 3px;}
.ztree li span.button.remove {background-position: -144px 0;vertical-align: top;background-image: url(imgs/jui.png);background-position-x: -138px;background-position-y: -137px;}
.ztree li span.button.roots_close, .ztree li span.button.root_close, .ztree li span.button.center_close, .ztree li span.button.bottom_close
{background-image: url(imgs/jui.png);background-position-x: -77px;background-position-y: -196px;}
.ztree li span.button.roots_open, .ztree li span.button.root_open, .ztree li span.button.center_open, .ztree li span.button.bottom_open
{background-image: url(imgs/jui.png);background-position-x: -117px;background-position-y: -196px;}
</style>
</head>
<body>
<div>
<ul id="treeDemo" class="ztree"></ul>
</div>
</body>
<script>
//zTree的配置
var setting = {
view: {
addHoverDom: addHoverDom,
removeHoverDom: removeHoverDom,
selectedMulti: false
},
edit: {
enable: true,
editNameSelectAll: true,
showRemoveBtn: showRemoveBtn,
showRenameBtn: showRenameBtn
},
data: {
simpleData: {
enable: true
}
},
callback: {
onClick:zTreeOnClick, //点击选中事件
beforeDrag: beforeDrag, // 可设置是否允许拖拽功能
beforeEditName: beforeEditName,
beforeRemove: beforeRemove,
beforeRename: beforeRename,
onRemove: onRemove,
onRename: onRename
}
}; //zTree初始化加载的节点树
var zNodes =[
{ id:1, pId:0, name:"父节点 1", open:true}, //open属性的值true和false,表示是否在初始化加载后展开子节点
{ id:11, pId:1, name:"子节点 1-1"},
{ id:12, pId:1, name:"子节点 1-2"},
{ id:13, pId:1, name:"子节点 1-3"},
{ id:2, pId:0, name:"父节点 2", open:true},
{ id:21, pId:2, name:"子节点 2-1"},
{ id:22, pId:2, name:"子节点 2-2"},
{ id:23, pId:2, name:"子节点 2-3"},
{ id:3, pId:0, name:"父节点 3", open:false},
{ id:31, pId:3, name:"子节点 3-1"},
{ id:32, pId:3, name:"子节点 3-2"},
{ id:33, pId:3, name:"子节点 3-3"},
]; var log, className = "dark";
function zTreeOnClick(event, treeId, treeNode) {
console.log('zTreeOnClick');
console.log(treeNode)
var treeObj = $.fn.zTree.getZTreeObj("treeDemo"),
nodes = treeObj.getCheckedNodes(true),
v = "";
for (var i = 0; i < nodes.length; i++) {
v += nodes[i].name + ",";
console.log("节点id:" + nodes[i].id + "节点名称" + v); //获取选中节点的值
}
}
function beforeDrag(treeId, treeNode) {
return false; //false=禁用拖拽功能, true=开启
}
function beforeEditName(treeId, treeNode) {
console.log('beforeEditName');
console.log(treeNode)
className = (className === "dark" ? "":"dark");
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
zTree.selectNode(treeNode);
zTree.editName(treeNode);
}
function beforeRemove(treeId, treeNode) {
console.log('beforeRemove');
className = (className === "dark" ? "":"dark");
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
zTree.selectNode(treeNode);
return confirm("确认删除 节点 -- " + treeNode.name + " 吗?");
}
function onRemove(e, treeId, treeNode) { //确定删除节点
console.log('onRemove');
console.log(treeNode)
}
function beforeRename(treeId, treeNode, newName, isCancel) {
console.log('beforeRename');
className = (className === "dark" ? "":"dark");
if (newName.length == 0) {
setTimeout(function() {
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
zTree.cancelEditName();
alert("节点名称不能为空。");
}, 0);
return false;
}
return true;
}
function onRename(e, treeId, treeNode, isCancel) {
console.log('onRename')
console.log(treeNode)
}
function showRemoveBtn(treeId, treeNode) {
return true;
}
function showRenameBtn(treeId, treeNode) {
return true;
} var newCount = 1;
function addHoverDom(treeId, treeNode) {
var sObj = $("#" + treeNode.tId + "_span");
if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
+ "' title='添加子节点' onfocus='this.blur();'></span>";
sObj.after(addStr);
$('.edit').attr('title', '编辑');
$('.remove').attr('title', '删除');
var btn = $("#addBtn_"+treeNode.tId);
if (btn) btn.bind("click", function(){
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
var obj = {id:(100 + newCount), pId:treeNode.id, name:"新增子节点 " + (newCount++)};
zTree.addNodes(treeNode, obj);
console.log(obj)
console.log('添加成功')
return false;
});
};
function removeHoverDom(treeId, treeNode) {
$("#addBtn_"+treeNode.tId).unbind().remove();
}; $(document).ready(function(){
console.log('ready');
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
</script>
</html>
其中的<style></style>部分是自定义的样式,主要用来更换插件默认的添加、删除、编辑、展开和收缩的小图标的
4、效果图
1、初始化加载页面后:

2、选中某个节点后,会出现添加、编辑、删除的操作图标:

3、在第一个父节点新增了一个子节点:

4、在某一个节点点击删除按钮后的确认提示:

5、点击了某一个节点的编辑按钮后,呈现可编辑状态:

6、编辑完成后点击空白处,即可完成编辑:

7、每个子节点下还可以再无限新增子节点

注:以上代码部分的操作,只是针对DOM做了增删改的操作,如果在具体项目业务中使用的话,还是要另外自己编写相应代码,来保存操作的数据,这里不再一一写出。
需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=fp9ccf07
树结构数据的展示和编辑-zTree树插件的简单使用的更多相关文章
- JQuery Ztree 树插件配置与应用小结
JQuery Ztree 树插件配置与应用小结 by:授客 QQ:1033553122 测试环境 Win7 jquery-3.2.1.min.js 下载地址: https://gitee.com/is ...
- easyui&8Jquery ztree树插件
7Jquery easyui前台UI框架 开发包: 7.1Layout页面布局 将课后资料中后台系统前台页面素材导入项目中 1.导入Jquery,easyui相关js,css文件 <link r ...
- 在vue中使用ztree树插件
插件资源及api:树官网 本事例是在vue3.0+中演示,事例是实际项目中正在用的组件所以部分打了马赛克. 1.插件准备(提前准备好插件文件) 可以直接在官网下载,搭建好脚手架后将准备好的文件放在li ...
- Jquery ztree树插件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Jquery ztree树插件2
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- zTree树插件动态加载
需求: 由于项目中家谱图数据量超大,而一般加载方式是通过,页面加载时 zTree.init方法进行数据加载,将所有数据一次性加载到页面中.而在项目中家谱级别又非常广而深,成千上万级,因此一次加载,完全 ...
- Ztree 树插件 树节点名称太长的解决方案
样式允许的情况下 给背景div加滚动条.. 或者使用省略号方法:使用addDiyDom http://blog.csdn.net/zhengbo0/article/details/17759543 ...
- 通用权限管理系统之权限菜单zTree树的展示及移动的处理方法
在通用权限管理系统中,有很多数据结构是有父子关系的,如组织机构,部门,权限菜单等,在展示的时候,大多数是通过zTree树的形式展现的,如下: 权限菜单展示 这种数据后台输出比较容易处理,参考如下获取某 ...
- ztree树默认根据ID默认选中该条数据
functiongetZtree() { varsetting = { view: { expandSpeed: 100, selectedMulti: true, showLine: true, / ...
随机推荐
- Rope整理(可持久化神器)
rope是什么?STL的内置的可持久化的数组.其最为方便的就是可以O1复制原来的数组.事实上rope的内置实现也是平衡树,由于只需要复制根结点,O1可以做到复制历史版本. 然而这个东西常数特大,不开O ...
- 使用Wireshark分析QQ聊天
- thinkCMF----增删改查操作
thinkCMF的增删改查基本操作: 一.增加数据 $res = Db::name('form')->insert($data); 示例代码: public function index(){ ...
- CentOS6.5 下将 Python2.6.6 升级到Python3.5
一. 从Python官网到获取Python3的包, 切换到目录/usr/local/src #wget https://www.python.org/ftp/python/3.5.1/Python-3 ...
- MySql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)
查询表信息(表名/表描述): SELECT table_name name,TABLE_COMMENT value FROM INFORMATION_SCHEMA.TABLES WHERE table ...
- logstash实战input插件syslog
vim /etc/logstash/conf.d/syslog.conf input{ syslog{ type => "system-syslog" port => ...
- 【转】C#线程篇
C# 温故而知新: 线程篇(一) C# 温故而知新: 线程篇(二) C# 温故而知新:线程篇(三) C# 温故而知新: 线程篇(四)
- codeforces 14A - Letter & codeforces 859B - Lazy Security Guard - [周赛水题]
就像title说的,是昨天(2017/9/17)周赛的两道水题…… 题目链接:http://codeforces.com/problemset/problem/14/A time limit per ...
- 2018java面试知识汇总
1. 多线程 1.1 多线程7种同步方法? 答:同步方法 同步代码块 使用重入锁实现线程同步(ReentrantLock) 使用特殊域变量(volatile)实现同步(每次重新计算,安全但并非一致) ...
- 在浏览器地址栏输入一个URL后回车,将会发生的事情?
https://yq.aliyun.com/articles/20667