ztree实现拖拽移动和复制

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: -1
        },
        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

复制结果

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



原文地址:https://www.cnblogs.com/xiaostudy/p/11515574.html

时间: 2024-10-09 21:33:15

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

zTree的拖拽排序

ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比如自定义一个tree传入ztree, 不使用ztree的识别字段,而是使用自定义字段,然后当ztree的节点发生变化时,维护这些自定义字段,从而使得整个tree是有序的,并支持拖拽. 上边的这个解决方案,有一个问题,就是使用javascript构造的tree,传入ztree之后,会发生堆栈溢出,初步

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

根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle.css" rel="stylesheet" /> <script src="../../Scripts/JQuery-zTree/js/jquery-1.4.4.min.js"></script> <script src=

结构-行为-样式 - Angularjs 环境下Ztree结合JqueryUI实现拖拽

新的项目中有一个需求是要求客户标签可以自定义,于是就想到了客户体验,让客户自己拖拽标签进行组合查询.但是理想很丰满,现实很骨感.一开始就遇到了问题,各个插件之间的结合问题,折腾一翻之后终于实现了这个功能,这里记录一下. 首先,在Angularjs+AMD+RequireJs的环境下引入插件: require.config({ baseUrl: "", urlArgs: 'ver=' + (+new Date()), waitSeconds: 0, paths: { 'jqueryUI'

VM虚拟机无法拖拽、粘贴、复制

VM无法从客户机拖放/复制文件到虚拟机的解决办法: 将这两项取消勾选,点击[确定].再次打开,勾选,点击[确定] 原因分析:可能是VM中默认是不支持该功能的,但是在配置窗体上确实默认打钩打上的. 依据:在操作过程中,你可以查看该虚拟机的的配置文件(*.vmx).观察以下节点 isolation.tools.copy.disable = "FALSE" isolation.tools.dnd.disable = "FALSE" isolation.tools.past

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

zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我将介绍如何实现使用该插件生成HTML元素Dom树,并对其进行多样操作. 先贴上一个简单的HTML页面(直接拿的ztree的用的,画面简单实用,里面的文字内容不用在意) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-e

Jquery 可拖拽的Ztree

比较懒,就只贴关键代码吧,自己把有用的属性全部打印出来了,也加了不少注释. 保存后涉及到的排序问题,刷新问题还未涉及到,后面有的话再加. 1 $.fn.zTree.init($("#ztree"), { 2 data: { 3 simpleData: { 4 enable: true 5 } 6 }, 7 view:{ 8 selectedMulti :false 9 }, 10 edit: { //此属性添加后,树才可以被拖拽 11 enable: true, 12 showRemo

拖拽+重叠+虚线框(解决移动文字复制问题)

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>拖拽+重叠+虚线框(解决移动文字复制问题)</title> <meta name="descriptio

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

ztree这个系列的最后一篇,也是ztree功能强大的体现之一--排序功能.ztree可以实现所有节点之间随意的拖拽排序功能,我这里根据需要实现了只允许同级之间随意拖拽排序,其实原理都一样,只是范围缩小了一些,多了一些判断而已.下面是每一层的代码,还是采取只贴出功能代码,因为这个拖拽排序功能我感觉很不错,所以单独拿出一篇博客来展示,也方便理解. Jsp页面实现功能的js代码如下: //拖拽前执行 var dragId; function beforeDrag(treeId, treeNodes)

Html5拖拽复制

拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需要实现Html5拖拽复制的功能,Html5拖拽复制很简单,只需要在普通Html5拖拽的过程中做一点小小的改动即可. ps: 本篇博文为非首页文章,只是简单的笔记. 浏览器支持 Internet Explorer 9 Firefox Opera 12 Chrome Safari 5 v1.0代码部分