简介
在某些管理界面下,会需要改动目录结构,这种情况下拖拽是最便捷的操作,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 的区别
Drag
Drag 是拖拽操作的起始动作,即鼠标左键在某个节点上按下并开始移动。
- beforeDrag 回调函数中 如果 return false; zTree 将阻止本次拖拽活动,可以利用 这个回调函数对拖拽的节点进行检测,判断是否允许拖拽。
- onDrag 回调函数触发时,说明已经开始了拖拽操作,界面上将能够看到有节点 DOM 跟随鼠标移动。
Drop
Drop 是拖拽操作的结束动作,即鼠标拖拽完成时,松开鼠标左键。
- beforeDrop 回调中 如果 return false; zTree 将阻止本次拖拽操作,将节点回归原位。
注意:此时 return false 不可能恢复到正在拖拽的状态。
- onDrop 回调触发时,拖拽操作完毕(如果拖拽到 zTree 外面也会触发 onDrop 的)
更加精细的控制:prev、inner、next
单纯利用 beforeDrop 对 拖拽节点进行控制是远远不够的,一旦禁止了拖拽, 用户又要重新进行拖拽操作,这样的的交互很不友好。 这时候你就需要使用 setting.edit.drag.prev / inner / next 这三个回调进行控制了。
这三个回调函数有以下特点:
- 回调函数都是拖拽进行中被触发的, return true / false 将会决定是否允许移动到目标节点的对应位置
- 回调函数 return false 的时候,不影响当前拖拽操作的交互,只会影响拖拽的箭头位置 对照 Demo 做做练习,你的拖拽控制绝对可以轻松自如。