1、官网下载ztree:http://www.treejs.cn/v3/api.php

2、引入jquery.ztree.all.min.js

注意,这是基于jQuery的插件,请引入相关js

3、设置setting

var setting = {
data: {
simpleData: {
enable: true,
idKey: "id",
pIdKey: "parentId",
rootPId: -
},
key: {
url: "nourl",
name: "fieldName"
}
},
check: {
nocheckInherit: true
},
callback: {
// 树的点击事件
onClick: zTreeOnClick,
// 拖拽结束事件
onDrop: zTreeOnDrop
},
// 开启拖拽
edit: {
drag: {
// 打开复制功能,Ctrl+鼠标左键点击后拖拽
isCopy: true,
// 打开移动功能,鼠标左键点击后拖拽
isMove: true
},
// 打开编辑
enable: true,
// 关闭删除
showRemoveBtn: false,
// 关闭修改名称
showRenameBtn: false
}
};

4、拖拽后函数

function zTreeOnDrop (event, treeId, treeNodes, targetNode, moveType, isCopy)
treeId:就是html的id
treeNodes:拖拽所选中的节点集合,可以多选
targetNode:拖拽目标节点,可以通过这个函数,设置treeNodes的所有id为targetNode['parentId'],然后重新加载ztree
moveType:移动类型,上移prev,下移next,内移inner,感觉用处不大
isCopy:是否复制,复制true,移动false

5、详解拖拽函数

// 全局变量,用于储存ztree集合
var ztreeList;
// 全局变量,用于储存最大id,是复制时使用,通过传参数不方便,用全局变量最好
var copyNodeMaxIndex;
//拖拽
function zTreeOnDrop (event, treeId, treeNodes, targetNode, moveType, isCopy){
// 复制
if(isCopy) {
for(var i = 0; i < ztreeList.length; i++) {
// 遍历ztree集合,找到根节点,拿到储存最大id,然后设置全局变量。说明:这里只是方便拿最大值id,放到那里都行
if("0" == ztreeList[i]['id']) {
copyNodeMaxIndex = ztreeList[i]['maxIndex'];
var temp = ztreeList[i];
// 调用复制节点集合到ztree集合,同时改变id和parentId
copyNodesToArray(treeNodes, targetNode['id'], true);
// 全局变量最大id放回根节点储存,将储存到数据库
temp['maxIndex'] = copyNodeMaxIndex;
// 根节点替换
ztreeList.splice(i, 1, temp);
}
}
} else {
// 移动,设置选中的节点集合【不包括子节点】的父节点为目标节点id
for(i in treeNodes) {
for(j in ztreeList) {
if(treeNodes[i]['id'] == ztreeList[j]['id']) {
ztreeList[j]['parentId'] = targetNode['id'];
break;
}
}
}
}
// 重新加载ztree
$.fn.zTree.init($("#ztree"), setting, ztreeList);
} /**
* 复制节点集合到全局变量ztree集合,同时改变id和parentId
* @param nodes
* @param parentId
* @param flag
*/
function copyNodesToArray(nodes, parentId, flag) {
// 循环节点集合
for(i in nodes) {
var node = nodes[i];
var children = node.children;
copyNodeMaxIndex++;
node['id'] = copyNodeMaxIndex;
node['parentId'] = parentId;
if(flag) {
node['fieldName'] = node['fieldName'] + "[副本]";
}
// 这里一定设置子节点为未定义,不然会复制双份
node.children = undefined;
// 添加节点到全局ztree集合,不包括子节点,只是复制节点本身
ztreeList.push(node);
if(2 == isOnlyChildren(children)) {
// 返回2表示节点集合除了本身外还有子节点,那么久让它递归添加到全局ztree集合里
copyNodesToArray(children, node['id'], false);
} else if(1 == isOnlyChildren(children)) {
// 返回1表示这节点集合除了本身外没有子节点,那么直接遍历子节点集合,设置id和parentId并添加到全局ztree集合里
for(j in children) {
copyNodeMaxIndex++;
children[j]['id'] = copyNodeMaxIndex;
children[j]['parentId'] = node['id'];
ztreeList.push(children[j]);
}
}
//返回0表示这节点集合不存在,那么就没有可处理了,上面已经处理了节点本身
}
} /**
* 判断节点集合是有多少级子节点。返回0表示这节点集合不存在,返回1表示这节点集合除了本身外没有子节点,返回2表示节点集合除了本身外还有子节点
* @param children
* @returns {number}
*/
function isOnlyChildren(children) {
if(undefined != children && children.length > 0) {
for(i in children) {
var children1 = children[i].children;
if(undefined != children1 && children1.length > 0) {
return 2;
}
}
return 1
}
return 0;
}

6、效果

移动1

移动2

结果

测试复制

复制1

复制2

复制结果

复制多层子节点也是可以得

												

ztree实现拖拽移动和复制的更多相关文章

  1. zTree的拖拽排序

    ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比 ...

  2. kali安装vmtool后依旧无法拖拽文件,复制粘贴,解决办法

    本文链接:https://blog.csdn.net/Key_book/article/details/80310235命令行下 执行 apt-get install open-vm-tools-de ...

  3. 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作

    回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...

  4. MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】

    根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...

  5. MVC+ZTree实现对树的CURD及拖拽操作

    上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑 ...

  6. 通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置

    zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我 ...

  7. Html5拖拽复制

    拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...

  8. ztree使用系列四(ztree实现同级拖拽排序并将排序结果保存数据库)

    ztree这个系列的最后一篇,也是ztree功能强大的体现之中的一个--排序功能. ztree能够实现全部节点之间任意的拖拽排序功能.我这里依据须要实现了仅仅同意同级之间任意拖拽排序,事实上原理都一样 ...

  9. Ubuntu 无法拖拽复制

    首先确定 在ubuntu 下,vmware tools 已经安装成功 有些时候会出现vmware tools 已经安装成功,但是却无法实现拖拽和复制 1.首先在虚拟机设置里面勾选共享剪切板 2.然后重 ...

随机推荐

  1. .net解决大文件断点续传

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  2. BZOJ 5469: [FJOI2018]领导集团问题 dp+线段树合并

    在 dp 问题中,如果发现可以用后缀最大值来进行转移的话可以考虑去查分这个后缀最大值. 这样的话可以用差分的方式来方便地进行维护 ~ #include <bits/stdc++.h> #d ...

  3. H5利用formData来上传文件(包括图片,doc,pdf等各种格式)方法小结!

    H5页面中我们常需要进行文件上传,那么怎么来实现这个功能呢??? 我主要谈如下两种方法. (一).传统的form表单方法 <form action="/Home/SaveFile1&q ...

  4. mybatis的判定时间字段问题 java.lang.IllegalArgumentException: invalid comparison: cn.hutool.core.date.DateTime and java.lang.String

    今天听组员说: mybatis在3.30版本及以上判定时间时 <if test="date_time != null and date_time != '' "> da ...

  5. Codevs 3122 奶牛代理商 VIII(状压DP)

    3122 奶牛代理商 VIII 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 小徐是USACO中国区的奶牛代理商,专门出售质优 ...

  6. CSS3之碰撞反弹动画无限运动

    示例代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. 在Windows环境下搭建Snort+BASE入侵检测系统

    操作系统: Windows 7 (service pack 1) 所需软件: 虚拟机:VirtualBox 网络数据包截取驱动程序:WinPcap 4.1.3 (WinPcap_4_1_3.exe) ...

  8. process.env.NODE_ENV理解

    1.理解NODE_ENV 在node中,有全局变量process表示的是当前的node进程.process.env包含着关于系统环境的信息.但是process.env中并不存在NODE_ENV这个东西 ...

  9. plsql 如何导入excel数据?

      oracle 导入excel数据? 通过plsql实现 1.准备工作 Excel中的字段名称,必须和表结构字段一 一对应 下面以tdoctor_apply表为例,进行演示 表结构 Excel表数据 ...

  10. vscode前端插件(我的标配)

    前言 今天给我的vscode编辑汉化了一下)我也不知道为什么要汉化一下... 但是汉化后 我的vue文件木有高亮了,2333(只好一顿操作 再安装插件 还要去百度找 自己留存) 汉化后 是所有的插件都 ...