07.02 如何实现拖拽节点 —— 关于 节点编辑

原创
2022/05/09 06:21
阅读数 1K

简介

在某些管理界面下,会需要改动目录结构,这种情况下拖拽是最便捷的操作,zTree 针对拖拽做了一些处理,便于用户在拖拽时做精细的控制。 不过很遗憾, zTree 制作时没有针对移动端做兼容,所以目前 zTree 并不支持移动设备的触屏拖拽操作。 看这篇文档时,你需要对照 API 文档进行学习(http://www.treejs.cn/v3/api.php

开启拖拽

配置说明

var setting = {
    edit: {
        enable: true,
        drag: {
            // 拖拽时父节点自动展开是否触发 onExpand 事件回调函数
            autoExpandTrigger: true,
            // 拖拽时, 设置是否允许复制节点
            isCopy: true,
            // 拖拽时, 设置是否允许移动节点
            isMove: true,
            // 拖拽到目标节点时,设置是否允许移动到目标节点前面的操作
            prev: function(treeId, treeNodes, targetNode) {...},
            // 拖拽到目标节点时,设置是否允许成为目标节点的子节点
            inner: function(treeId, treeNodes, targetNode) {...},
            // 拖拽到目标节点时,设置是否允许移动到目标节点后面的操作
            next: function(treeId, treeNodes, targetNode) {...},
            // 拖拽节点成为根节点时的 Tree 内边界范围 (单位:px)
            borderMax: 10,
            // 拖拽节点成为根节点时的 Tree 外边界范围 (单位:px)
            borderMin: -5,
            // 判定是否拖拽操作的最小位移值 (单位:px)
            minMoveSize: 5,
            // 拖拽多个兄弟节点时,浮动图层中显示的最大节点数。 多余的节点用...代替
            maxShowNodeNum: 5,
            // 拖拽时父节点自动展开的延时间隔
            autoOpenTime: 500
        }
    },
    callback: {
        // 拖拽过程中, 移动到处于折叠状态的父节点时,停留一定时间后,会触发此回调, 
        // 如果 return false;则阻止自动展开该父节点的操作。(此回调没有对应的 on…回调)
        beforeDragOpen: function(treeId, treeNode) {...},
        // 拖拽操作开始时,首先触发此回调, 如果 return false;则阻止拖拽操作
        beforeDrag: function(treeId, treeNodes) {...},
        // 拖拽到目标位置,松开鼠标时,首先触发此回调,如果 return false;则阻止整个拖拽行为,节点还原
        beforeDrop: function(treeId, treeNodes, targetNode, moveType, isCopy) {...},
        // 拖拽操作成功开始后, 触发此回调
        onDrag: function(e, treeId, treeNodes) {...},
        // 主要用于捕获 zTree 节点拖拽到 DOM 的事件,从而操作对应的 DOM。
        onDragMove: function(e, treeId, treeNodes) {...},
        // 拖拽成功后,触发此回调
        onDrop: function(e, treeId, treeNodes, targetNode, moveType, isCopy) {...}
    }
};

注意

beforeDrop / onDrop 回调函数中都有一个参数:moveType,此参数是与 targetNode 参数配套的,绝对不能只根据 targetNode 判断拖拽位置。因为 moveType 是拖拽的位置,这个类型是相对于 targetNode 的位置。

比如:拖拽节点 X 到 节点 A 和 B 之间结束拖拽,回调被触发时, targetNode = A; moveType = 'next' 和 targetNode = B; moveType = 'prev'; 的结果是完全一样的

Drag 和 Drop 的区别

参考Demo:http://www.treejs.cn/v3/demo.php#_301

Drag

Drag 是拖拽操作的起始动作,即鼠标左键在某个节点上按下并开始移动。

  • beforeDrag 回调函数中 如果 return false; zTree 将阻止本次拖拽活动,可以利用 这个回调函数对拖拽的节点进行检测,判断是否允许拖拽。
  • onDrag 回调函数触发时,说明已经开始了拖拽操作,界面上将能够看到有节点 DOM 跟随鼠标移动。

Drop

Drop 是拖拽操作的结束动作,即鼠标拖拽完成时,松开鼠标左键。

  • beforeDrop 回调中 如果 return false; zTree 将阻止本次拖拽操作,将节点回归原位。注意:此时 return false 不可能恢复到正在拖拽的状态。
  • onDrop 回调触发时,拖拽操作完毕(如果拖拽到 zTree 外面也会触发 onDrop 的)

更加精细的控制:prev、inner、next

参考Demo:http://www.treejs.cn/v3/demo.php#_302

单纯利用 beforeDrop 对 拖拽节点进行控制是远远不够的,一旦禁止了拖拽, 用户又要重新进行拖拽操作,这样的的交互很不友好。 这时候你就需要使用 setting.edit.drag.prev / inner / next 这三个回调进行控制了。

这三个回调函数有以下特点:

  • 回调函数都是拖拽进行中被触发的, return true / false 将会决定是否允许移动到目标节点的对应位置
  • 回调函数 return false 的时候,不影响当前拖拽操作的交互,只会影响拖拽的箭头位置 对照 Demo 做做练习,你的拖拽控制绝对可以轻松自如。
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部