最近在项目当中遇到一个需求,需要以树结构的方式展示一些数据,并可对每一个树节点做内容的编辑以及树节点的添加和删除,刚好听说有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树插件的简单使用的更多相关文章

  1. JQuery Ztree 树插件配置与应用小结

    JQuery Ztree 树插件配置与应用小结 by:授客 QQ:1033553122 测试环境 Win7 jquery-3.2.1.min.js 下载地址: https://gitee.com/is ...

  2. easyui&8Jquery ztree树插件

    7Jquery easyui前台UI框架 开发包: 7.1Layout页面布局 将课后资料中后台系统前台页面素材导入项目中 1.导入Jquery,easyui相关js,css文件 <link r ...

  3. 在vue中使用ztree树插件

    插件资源及api:树官网 本事例是在vue3.0+中演示,事例是实际项目中正在用的组件所以部分打了马赛克. 1.插件准备(提前准备好插件文件) 可以直接在官网下载,搭建好脚手架后将准备好的文件放在li ...

  4. Jquery ztree树插件

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. Jquery ztree树插件2

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. zTree树插件动态加载

    需求: 由于项目中家谱图数据量超大,而一般加载方式是通过,页面加载时 zTree.init方法进行数据加载,将所有数据一次性加载到页面中.而在项目中家谱级别又非常广而深,成千上万级,因此一次加载,完全 ...

  7. Ztree 树插件 树节点名称太长的解决方案

    样式允许的情况下 给背景div加滚动条.. 或者使用省略号方法:使用addDiyDom   http://blog.csdn.net/zhengbo0/article/details/17759543 ...

  8. 通用权限管理系统之权限菜单zTree树的展示及移动的处理方法

    在通用权限管理系统中,有很多数据结构是有父子关系的,如组织机构,部门,权限菜单等,在展示的时候,大多数是通过zTree树的形式展现的,如下: 权限菜单展示 这种数据后台输出比较容易处理,参考如下获取某 ...

  9. ztree树默认根据ID默认选中该条数据

    functiongetZtree() { varsetting = { view: { expandSpeed: 100, selectedMulti: true, showLine: true, / ...

随机推荐

  1. OpenStack入门之【OpenStack-havana】之单网卡-All In One 安装(基于CentOS6.4)

    这篇文章是自己的一篇老文,分享下,请君慢用.... =========================================== [特别申明]:经过了一段时间的不断学习加不断的测试得出本文, ...

  2. nginx命令行参数和信号

    nginx命令行参数 [user@host dir]$ /usr/local/nginx/sbin/nginx -hnginx version: nginx/1.8.0Usage: nginx [-? ...

  3. 跟bWAPP学WEB安全(PHP代码)--HTML注入和iFrame注入

    背景 这里讲解HTML注入和iFrame注入,其他的本质都是HTML的改变.那么有人会问,XSS与HTML注入有啥区别呢?其实本质上都是没有区别的,改变前端代码,来攻击客户端,但是XSS可以理解为注入 ...

  4. 23种设计模式之享元模式(FlyWeight)

    享元模式是一种对象结构型模式,通过运用共享技术,有效地支持大量细粒度的对象.系统只使用少量的对象,而这些对象都很相似,状态变化很小,对象使用次数增多.享元对象能做到共享的关键是区分内部状态和外部状态. ...

  5. vim配置函数跳转(c/c++)

    暂时草记一下,有时间好好整理 ctags 如果只是查看函数与变量是在哪里定义的,用ctags就可以了. ctrl+]跳到定义的地方,ctrl+t跳回来. 想要像IDE那样在旁边显示函数与变量列表,用t ...

  6. 从底层源码浅析Mybatis的SqlSessionFactory初始化过程

    目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...

  7. poj2528 Mayor's posters【线段树】

    The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...

  8. hdu5266 pog loves szh III 【LCA】【倍增】

    Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of ...

  9. PyQT5-QSlide滑块

    """ QSlider:是一个小滑块组件,这个小滑块能够被拖着一起滑动,用于通常修改具有一定范围的数据 Author: dengyexun DateTime: 2018. ...

  10. Python面向对象:类、实例与访问限制

    首先记录下面向对象的名词: 对象:python万物皆对象,程序设计的东西在对象上体现. 类:具有相同属性和行为的对象的集合. 消息:各个对象之间通过消息相互联系. 方法:对象功能实现的过程. 封装:把 ...