这个功能看起来很高大上,其实吧,实际做的时候才知道so easy。
节点拖拽,就是在操作tree的时候,可以把节点放在tree的任意位置上。当拖动一个节点的时候,可把它的子节点也一并拖拽到目标节点下,对于要拖拽的节点、目标节点、以及拖拽前后的操作,我们也都可自行控制,听起来是不是方便到家啦,哈哈,这个功能就是这样,看起来炫,做起来还超简单!
1. 需要在定义tree的时候添加一些属性(前几篇博客中已经介绍过,追加上去就可以了)
//编辑功能
edit: {
drag: {
autoExpandTrigger: true,
prev: dropPrev,
inner: dropInner,
next: dropNext
},
}
callback: {
beforeDrag: beforeDrag,
beforeDrop:beforeDrop,
beforeDragOpen: beforeDragOpen,
onDrag: onDrag,
onDrop: onDrop
}
拖拽属性说明:
autoExpandTrigger: true, //拖拽时父节点自动展开是否触发onExpand 事件回调函数。
prev: dropPrev, //拖拽到目标节点时,设置是否允许移动到目标节点前面的操作。
inner: dropInner, //拖拽到目标节点时,设置是否允许成为目标节点的子节点。
next: dropNext //拖拽到目标节点时,设置是否允许移动到目标节点后面的操作。
回调函数说明:
beforeDrag: beforeDrag, //用于捕获节点被拖拽之前的事件回调函数,并且根据返回值确定是否允许开启拖拽操作
beforeDrop:beforeDrop, //用于捕获节点拖拽操作结束之前的事件回调函数,并且根据返回值确定是否允许此拖拽操作
beforeDragOpen: beforeDragOpen, //用于捕获拖拽节点移动到折叠状态的父节点后,即将自动展开该父节点之前的事件回调函数,并且根据返回值确定是否允许自动展开操作
onDrag: onDrag, //用于捕获节点被拖拽的事件回调函数
onDrop: onDrop, //用于捕获节点拖拽操作结束的事件回调函数
onExpand: onExpand, //用于捕获节点被展开的事件回调函数2. 上边并不是所有的方法都要用到的,我在项目中只用了几个需要用的,所以定义的时候不用都定义出来
beforeDrag方法:在拖拽之前,先判断该节点能否被拖拽,能拖拽的才会继续后续操作,否则直接退出拖拽功能
function beforeDrag(treeId, treeNodes) {
className = (className === "dark" ? "":"dark");
for (var i=0,l=treeNodes.length; i
beforeDrop方法:在添加到目标节点下之前,判断目标节点是否存在(这里限制了对于根节点的添加),若存在则判断目标节点下是否已存在相同的节点
function beforeDrop(treeId, treeNodes, targetNode, moveType, isCopy) {
//如果有提交到后台的操作,则会先执行if…else…再执行post等提交操作
if(targetNode) {
if(targetNode.children != undefined){
//console.log(targetNode.children[0].name)
//var nodes = targetNode.children;
var name = treeNodes[0].name;
for (i = 0; i < targetNode.children.length; i++) {
if(targetNode.children[i].name == name){
alert("Error: This name already exists.");
return false;
}
}
}
return true;
}
return false;
}
onDrop方法:在加入到目标节点时,一并将信息提交给后台进行更新,额。。。post方法不规范,大家自己改吧
function onDrop(event, treeId, treeNodes, targetNode, moveType, isCopy) {
className = (className === "dark" ? "":"dark");
//拖拽成功时,修改被拖拽节点的pid
if(treeNodes && targetNode){
$.post('./index.php?r=selenium/updatePId&id='+treeNodes[0].id+"&pid="+targetNode.id)
rightContent(treeNodes[0]); //调用右半部分
}
}