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

 

 復制結果

 

 復制多層子節點也是可以得

 

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM