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. sping boot 集成shiro

    springboot整合shiro应用   1.Shiro是Apache下的一个开源项目,我们称之为Apache Shiro.它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理 ...

  2. siameseNet网络以及信号分类识别应用

    初学siameseNet网络,希望可以用于信号的识别分类应用.此文为不间断更新的笔记. siameseNet简介 全连接孪生网络(siamese network)是一种相似性度量方法,适用于类别数目多 ...

  3. Mycat 全局系列号(转载)

    概述 本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点. 配置 文件方式获取 1.修改server配置文件 vim server.xml < ...

  4. If...else 条件判断和If else嵌套

    If(条件表达式){ 如果条件表达式结果为true,执行该处代码. 如果条件表达式结果为false,执行下边代码. }else{ 如果条件表达式结果为false,执行该处代码. } If(条件表达式) ...

  5. 关于移动虚拟机后,linux网卡启动异常问题解决

    废话不多说,直接上解决办法. 首先执行命令:ifconfig -a 会发现原来是eth0, 而现在变成了eth1了 然后我们编辑规则配置信息: vim /etc/udev/rule.d/70-pers ...

  6. Java为什么没有指针

    为了摒弃指针带来的风险(当然了,也就放弃了指针带来的效率). 1.C/C++为什么有指针? 这个很简单,程序都是在内存中运行的,只要有内存,就有内存地址,有地址,就必然有指针,只是C++对内存地址的访 ...

  7. Hadoop(三)—— YARN

    YARN产生的背景 Hadoop相关概念 Hadoop 1.0 由HDFS.MapReduce组成. Hadoop 2.0 克服1.0中HDFS和MapReduce存在的各种问题而提出的. YARN是 ...

  8. 京津冀大学生竞赛:babyphp

    京津冀大学生竞赛:babyphp 比赛的时候没做出来,回来以后一会就做出来了,难受...还是基本功不扎实,都不记得__invoke怎么触发的了 放上源码 <?php error_reportin ...

  9. 单细胞ENS发育数据库

    iSyTE 2.0: a database for expression-based gene discovery in the eye - 眼睛发育 StemMapper: a curated ge ...

  10. activiti 自定义用户

    https://blog.csdn.net/meng564764406/article/details/53789958 此文目的: 对网络上的关于对activiti 使用做一个总结,因为很难找到一个 ...